Я учусь тому, как вызывать код C ++ из Perl, и для начала пытаюсь создать базовый объект C ++ из сценария Perl.
Чтобы сделать это, я начал с выполнения h2xs
команда:
h2xs -A -nMyClass
Затем я добавил следующие два аргумента в сгенерированный Makefile.PL
использовать g++
компилятор.
CC => 'g++',
LD => 'g++',
Я создал свой простой класс в .xs
файл и написал код 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)
Затем я создал файл карты типов, чтобы сопоставить новый тип с Perl.
TypeMap
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'
Я искал повсюду, пытаясь найти причину этих предупреждений, и не могу понять, что происходит. Все предупреждения появляются из одного и того же повторяющегося раздела кода, который появляется в начале каждого определения функции.
внутри MyClass.c
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...
Может кто-нибудь сказать, пожалуйста, причину этих предупреждений?
Я использую Perl v5.10.1 и g ++ версии 4.4.7
Решение состоит в том, чтобы использовать более новую версию Perl. v5.10.1 очень устарел, и эти проблемы не встречаются в более поздних версиях.
Я публикую ответ на свой вопрос, потому что он был дан в комментариях, но официальный ответ так и не был опубликован.
Других решений пока нет …