我在使用swig在PHP中包装我的c ++类时遇到问题: 我的类在头文件中声明如下:
#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文件时,我发现class Ccrypto
已被声明两次。我是说我有:
Abstract class Ccrypto {
....
}
和
class Ccrypto {
...
}
为什么SWIG会为我的班级生成两个声明?
答案 0 :(得分:3)
问题是你有一个与模块同名的类(%module
或命令行上的-module)。 SWIG将C ++中的自由函数公开为具有模块名称的抽象类的静态成员函数。这是为了模仿我认为的命名空间。因此,生成的PHP将包含两个类,如果您是与模块同名的类并且具有任何非成员函数,则为一个抽象类。
你可以用以下方法测试:
%module test
%inline %{
class test {
};
void some_function() {
}
%}
会产生您报告的错误。
我有点惊讶的是,在看到PHP运行时错误之前,SWIG没有对此发出警告。生成Java时,它为同一接口提供以下错误:
类名不能等于模块类名:test
有几种方法可以解决这个问题:
重命名该课程(使用%rename
):
%module test
%rename (test_renamed) test;
%inline %{
class test {
};
void some_function() {
}
%}
隐藏自由功能:
%ignore some_function;