3

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 Ccrypto2回宣言されていることがわかりました。私が持っていることを意味します:

Abstract class Ccrypto {
....
}

class Ccrypto {
...
}

SWIGがクラスに対して2つの宣言を生成するのはなぜですか?

4

1 に答える 1

3

%module問題は、モジュール(またはコマンドラインの-module)と同じ名前のクラスがあることです。SWIGは、C ++の無料関数を、モジュールの名前を持つ抽象クラスの静的メンバー関数として公開します。これは、私が思う名前空間を模倣することを目的としています。したがって、生成されたPHPには2つのクラスが含まれます。モジュールと同じ名前のクラスで、メンバー以外の関数がある場合は、1つは抽象クラスです。

これは次の方法でテストできます。

%module test

%inline %{
class test {
};

void some_function() {
}
%}

これにより、報告したエラーが発生します。

PHPランタイムエラーが発生する前にSWIGがこれについて警告しないことに少し驚いています。Javaを生成するときに、同じインターフェイスに対して次のエラーが発生します。

クラス名をモジュールクラス名と同じにすることはできません:test

これを回避する方法はいくつかあります。

  1. モジュールの名前を変更します
  2. コードベースでクラスの名前を変更します。
  3. クラスの名前を(を使用して%rename)変更します。

    %module test
    
    %rename (test_renamed) test;
    
    %inline %{
    class test {
    };
    
    void some_function() {
    }
    %}
    
  4. 無料の機能を非表示にします。

    %ignore some_function;
    
于 2012-09-16T14:56:24.973 に答える