2017-11-06 12 views
8

私は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

+3

この種のコンパイラ警告は、新しいperlを使用したときに*大きく改善されます。 C++との互換性も向上します。何らかの手段で可能であれば、最近のリリースをインストールすることを検討してください。 'perlbrew 'を介して。 Perl 5.10.1は8歳以上です。 – amon

+0

残念ながら、私はRedHat 6上でPerlの利用可能なものだけを持っています:( – tjwrona1992

+0

あなたは、より新しいバージョンのperlをインストールできませんか?インターネットやローカルYumリポジトリにアクセスする必要がありますか? –

答えて

0

ソリューションはPerlの新しいバージョンを使用することです。 v5.10.1は非常に古く、これらの問題はそれ以降のバージョンでは発生しません。

私は自分の質問に答えを投稿していますが、これはコメントで回答されているためですが、正式な回答は投稿されていません。