Tôi đang học cách gọi mã C++ từ Perl và bắt đầu tôi đang cố gắng tạo một đối tượng C++ cơ bản từ một tập lệnh Perl.Perl XS không sử dụng biến 'Perl___notused' cảnh báo
Để làm điều này, tôi bắt đầu bằng cách thực hiện lệnh h2xs
:
h2xs -A -nMyClass
Sau đó, tôi thêm vào hai tham số sau vào tạo Makefile.PL
sử dụng trình biên dịch g++
.
CC => 'g++',
LD => 'g++',
Tôi tạo ra lớp đơn giản của tôi trong file .xs
và viết mã XS để lập bản đồ nó với 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)
Sau đó, tôi tạo ra các tập tin typemap để lập bản đồ loại mới cho 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;
}
Cuối cùng tôi đã tạo ra một thử nghiệm đơn giản.
t/MyClass.t
use Test::More tests => 2;
BEGIN { use_ok('MyClass') };
my $obj = MyClass->new(1);
ok($obj->isa('MyClass'), 'MyClass object constructed');
sau đó tôi đã xây dựng thành công mã và chạy các bài kiểm tra.
perl Makefile.PL
make
make test
Mặc dù tất cả mọi thứ hoạt động tốt, tôi nhận được một số cảnh báo với việc xây dựng:
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'
Tôi đã tìm kiếm khắp nơi trên cố gắng để tìm ra nguyên nhân cho những cảnh báo này, và không thể tìm ra những gì đang diễn ra. Tất cả các cảnh báo dường như đến từ cùng một phần lặp lại trong mã xảy ra ở đầu mỗi định nghĩa hàm.
bên 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...
Ai đó có thể xin vui lòng cho tôi biết nguyên nhân gốc rễ của những cảnh báo này?
Tôi đang sử dụng Perl v5.10.1 và g ++ phiên bản 4.4.7
Các loại cảnh báo trình biên dịch này nhận được * đáng kể * tốt hơn (tức là thường biến mất theo cách riêng) khi bạn sử dụng một perl mới hơn. Khả năng tương thích với C++ cũng cải thiện. Nếu có thể, hãy xem xét cài đặt bản phát hành gần đây, ví dụ: thông qua 'perlbrew'. Perl 5.10.1 đã hơn 8 tuổi. – amon
Thật không may tôi chỉ có những gì có sẵn cho Perl ra khỏi hộp trên redhat 6: ( – tjwrona1992
Bạn có thể không cài đặt một phiên bản mới hơn của perl? Chắc chắn bạn nên có quyền truy cập vào internet hoặc một số kho yum địa phương? –