1

SWIGを使用して、C++ プログラム用の Perl モジュールを生成しました。C++ コードに「char ポインタ」を返す関数が 1 つあります。現在、Perl で返された char ポインターを印刷または取得する方法がわかりません。

サンプル C コード:

 char* result() { 
     return "i want to get this in perl"; 
 } 

この関数「result」を Perl で呼び出して、文字列を出力したいと考えています。

どうやってするか?

よろしく、 アナンダン

4

2 に答える 2

5

C++ インターフェースの複雑さによっては、SWIG を省略して自分で XS コードを作成する方が、簡単で、高速で、保守しやすい場合があります。XS&C++ は少し難解な技術です。そのため、Mattia Barbon の優れたExtUtils::XSppモジュールが CPAN に用意されています。これにより、C++ のラッピングが簡単になります (そしてほとんど楽しくなります)。

ExtUtils::XSpp ディストリビューションには、文字列 (char*) と整数メンバーを持つクラスの非常に単純な (そして工夫された)例が含まれています。カットダウン インターフェイス ファイルは次のようになります。

// This will be used to generate the XS MODULE line
%module{Object::WithIntAndString};

// Associate a perl class with a C++ class
%name{Object::WithIntAndString} class IntAndString
{
  // can be called in Perl as Object::WithIntAndString->new( ... );
  IntAndString();

  // Object::WithIntAndString->newIntAndString( ... );
  // %name can be used to assign methods a different name in Perl
  %name{newIntAndString} IntAndString( const char* str, int arg );

  // standard DESTROY method
  ~IntAndString();

  // Will be available from Perl given that the types appear in the typemap
  int GetInt();
  const char* GetString ();

  // SetValue is polymorphic. We want separate methods in Perl
  %name{SetString} void SetValue( const char* arg = NULL );
  %name{SetInt} void SetValue( int arg );
};

これにはまだ有効な XS タイプマップが必要であることに注意してください。これは非常に単純なので、ここでは追加しませんが、上記のリンクのサンプル ディストリビューションで見つけることができます。

于 2009-09-07T07:29:56.753 に答える
-1

www.swig.org/tutorial.html にある SWIG チュートリアルを参照している必要があります。ともかく
、perl から C 関数を呼び出したいだけなので、
1. インターフェイス ファイルを入力します (すべての関数宣言をラッパーとモジュールセクション)。
2. swig とオプションを付けてコンパイルします。
3. gcc でコンパイルしてオブジェクトを作成します。
4. gcc オプションを使用してコンパイルし、共有オブジェクトを作成します。
5. 次のようにプログラムを実行します。

perl  
use moduleName;  
$a = moduleName::result();  

[注: 生成されたモジュール ファイル (.pm) を調べて、ラッパー ファイル内の正しい関数を指す正しい関数プロトタイプを見つけてください。]

于 2011-06-08T08:20:56.043 に答える