我用swig将c类包装在PHP中时遇到问题:
我的课程在头文件中声明如下:
#include <string.h>
using namespace std;
class Ccrypto
{
int retVal;
public:
int verify(string data, string pemSign, string pemCert);
long checkCert(string inCert, string issuerCert, string inCRL);
int verifyChain(string inCert, string inChainPath);
int getCN(string inCert, string &outCN);
};
这些方法中的每一个都包含几个功能.
我的界面文件如下:
%module Ccrypto
%include <std_string.i>
%include "Ccrypto.h"
%include "PKI_APICommon.h"
%include "PKI_Certificate.h"
%include "PKI_Convert.h"
%include "PKI_CRL.h"
%include "PKI_TrustChain.h"
%{
#include "Ccrypto.h"
#include "PKI_APICommon.h"
#include "PKI_Certificate.h"
#include "PKI_Convert.h"
#include "PKI_CRL.h"
#include "PKI_TrustChain.h"
%}
我生成了Ccrypto.so文件,没有任何错误.但是,当我在代码中使用此类时,会遇到此错误:
Fatal error: Cannot redeclare class Ccrypto in /path/to/my/.php file
当我检查Ccrypto.php文件时,我发现Ccryptohas类被声明了两次.我的意思是:
Abstract class Ccrypto {
....
}
和
class Ccrypto {
...
}
为什么SWIG为我的班级生成两个声明?
解决方法:
问题是您有一个与模块同名的类(命令行上为%module或-module). SWIG在C中将*函数公开为带有模块名称的抽象类的静态成员函数.这是为了模仿我认为的名称空间.因此,生成的PHP将包含两个类,如果您的类与模块同名并且具有任何非成员函数,则该类将为一个抽象.
您可以使用以下方法进行测试:
%module test
%inline %{
class test {
};
void some_function() {
}
%}
产生您报告的错误.
对于SWIG在看到PHP运行时错误之前没有发出警告,我感到有些惊讶.对于生成Java的同一接口,它会给出以下错误:
Class name cannot be equal to module class name: test
有几种可能的方法可以解决此问题:
>重命名模块
>在代码库中重命名该类.
>重命名类(使用%rename):
%module test
%rename (test_renamed) test;
%inline %{
class test {
};
void some_function() {
}
%}
>隐藏免费功能:
%ignore some_function;