2017-11-06 21 views
8

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

+3

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

+0

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

+0

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? –

Trả lời

0

Các giải pháp là sử dụng một phiên bản mới hơn của Perl. v5.10.1 rất lỗi thời và những vấn đề này không xảy ra trong các phiên bản sau.

Tôi đăng câu trả lời cho câu hỏi của riêng mình vì câu trả lời đã được trả lời trong các nhận xét nhưng câu trả lời chính thức chưa bao giờ được đăng.

Các vấn đề liên quan