PHP-SWIG致命错误:无法重新声明类

我用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;
上一篇:Python-SWIG与来自boost预处理器的预处理器宏


下一篇:如何使用SWIG从Python使C类可迭代?