私はPerlからC++コードを呼び出す方法を学び始めています。私はPerlスクリプトから基本的なC++オブジェクトを作成しようとしています。これを行うにはPerl XS未使用変数 'Perl___notused'警告
が、私はh2xs
のコマンドを実行して開始しました:
h2xs -A -nMyClass
それから私はg++
コンパイラを使用するために生成Makefile.PL
に、次の2つの引数を追加しました。
CC => 'g++',
LD => 'g++',
は、私はその後、私はマップするためにタイプマップファイルを作成し
.xs
ファイルに私の単純なクラスを作成したとPerlでそれをマップ
MyClass.xs
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#ifdef __cplusplus
}
#endif
class MyClass {
public:
MyClass(int value) {
value_ = value;
}
~MyClass() {}
int value() { return value_; }
void set_value(int value) {
value_ = value;
}
private:
int value_;
};
MODULE = MyClass PACKAGE = MyClass
MyClass *
MyClass::new(int value)
void
MyClass::DESTROY()
int
MyClass::value()
void
MyClass::set_value(int value)
しXSコードを書きました新しいタイプのPerl。
TYPEMAP
MyClass * O_OBJECT
######################################################################
OUTPUT
# The Perl object is blessed into 'CLASS', which should be a
# char* having the name of the package for the blessing.
O_OBJECT
sv_setref_pv($arg, CLASS, (void*)$var);
######################################################################
INPUT
O_OBJECT
if(sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG))
$var = ($type)SvIV((SV*)SvRV($arg));
else{
warn(\"${Package}::$func_name() -- $var is not a blessed SV reference\");
XSRETURN_UNDEF;
}
タイプマップは、最後に、私は簡単なテストを作成しました。
トン/ MyClass.t
use Test::More tests => 2;
BEGIN { use_ok('MyClass') };
my $obj = MyClass->new(1);
ok($obj->isa('MyClass'), 'MyClass object constructed');
私は、成功したコードを構築し、テストを実行しました。
perl Makefile.PL
make
make test
すべてが正常に動作しますが、私はビルドで、いくつかの警告が出ます:
MyClass.c: In function 'void XS_MyClass_new(PerlInterpreter*, CV*)':
MyClass.c:95: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void XS_MyClass_DESTROY(PerlInterpreter*, CV*)':
MyClass.c:119: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void XS_MyClass_value(PerlInterpreter*, CV*)':
MyClass.c:145: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void XS_MyClass_set_value(PerlInterpreter*, CV*)':
MyClass.c:174: warning: unused variable 'Perl___notused'
MyClass.c: In function 'void boot_MyClass(PerlInterpreter*, CV*)':
MyClass.c:203: warning: unused variable 'Perl___notused'
私はすべてのこれらの警告の原因を見つけようと上を検索し、何を把握することはできません続行中です。すべての警告は、すべての関数定義の冒頭で発生する同じ繰り返しセクションから来ているようです。
XS(XS_MyClass_new); /* prototype to pass -Wmissing-prototypes */
XS(XS_MyClass_new)
{
#ifdef dVAR
dVAR; dXSARGS; // <-- warning occurs here
#else
dXSARGS;
#endif
// function body continues...
MyClass.c内部
は、誰かが私にこの警告の根本原因を教えていただけますか?
私は、Perl v5.10.1とグラムを使用しています++バージョン4.4.7
この種のコンパイラ警告は、新しいperlを使用したときに*大きく改善されます。 C++との互換性も向上します。何らかの手段で可能であれば、最近のリリースをインストールすることを検討してください。 'perlbrew 'を介して。 Perl 5.10.1は8歳以上です。 – amon
残念ながら、私はRedHat 6上でPerlの利用可能なものだけを持っています:( – tjwrona1992
あなたは、より新しいバージョンのperlをインストールできませんか?インターネットやローカルYumリポジトリにアクセスする必要がありますか? –