2017-11-06 430 views
8

Perl'den C++ kodunu nasıl arayacağımı öğrenmek ve bir Perl komut dosyasından temel bir C++ nesnesi oluşturmaya çalışıyorum. Perl XS kullanılmayan değişken 'Perl___notused' uyarılar

Bunu yapmak için

, ben h2xs komutu yürüterek başlamış:

h2xs -A -nMyClass

Sonra g++ derleyici kullanmak için oluşturulan Makefile.PL için aşağıdaki iki argüman ekledi.
CC => 'g++', 
LD => 'g++', 

Ben Sonra haritaya türeşlem dosyası oluşturduk .xs dosyada benim basit sınıf oluşturulur ve Perl ile eşlemek

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) 

için XS kodu yazdım Perl için yeni tip.

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; 
     } 

türeşlem Sonunda basit bir test yarattı.

t/MyClass.t

use Test::More tests => 2; 
BEGIN { use_ok('MyClass') }; 

my $obj = MyClass->new(1); 
ok($obj->isa('MyClass'), 'MyClass object constructed'); 

Sonra başarıyla kod inşa edilmiş ve testler yaptık. Her şey gayet iyi çalışıyor olsa

perl Makefile.PL 
make 
make test 

, ben yapı ile bazı uyarılar alıyorum:

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' 
Bütün bu uyarıları nedenini bulmaya çalışırken üzerine aradı ve çözemiyorum

neyi oluyor. Tüm uyarılar, her işlev tanımının başlangıcında ortaya çıkan kodda aynı tekrarlanan bölümden gelir.

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

birisi bana bu uyarıları temel nedenini söyleyebilir misiniz?

I 4.4.7

+3

Bu tür derleyici uyarıları, daha yeni bir perl kullandığınızda * önemli ölçüde daha iyi (yani, genellikle kendi başlarına yok olur) alır. C++ ile uyumluluk da geliştirir. Mümkünse, yeni bir sürümü yayınlamayı düşünün, ör. perlbrew ile. Perl 5.10.1, 8 yaşın üzerindedir. – amon

+0

Ne yazık ki sadece Perl için redhat 6 kutusunun dışında ne var var :( – tjwrona1992

+0

Perl daha sonraki bir sürümünü yükleyemez misiniz? Şüphesiz internet veya bazı yerel yum depo erişim olmalıdır? –

cevap

0

çözeltisi Perl daha yeni bir sürümü kullanmaktır ++ sürüm Perl v5.10.1 ve g kullanıyorum. v5.10.1 çok eski ve bu sorunlar daha sonraki sürümlerde oluşmaz.

Kendi sorumluğuma bir yanıt gönderiyorum çünkü yorumlarda yanıtlandı, ancak resmi bir yanıt hiç yayınlanmadı.