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
, benh2xs
komutu yürüterek başlamış:
h2xs -A -nMyClass
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 iç
birisi bana bu uyarıları temel nedenini söyleyebilir misiniz?
I 4.4.7
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
Ne yazık ki sadece Perl için redhat 6 kutusunun dışında ne var var :( – tjwrona1992
Perl daha sonraki bir sürümünü yükleyemez misiniz? Şüphesiz internet veya bazı yerel yum depo erişim olmalıdır? –