2017-11-06 21 views
8

मैं सीख रहा हूं कि पर्ल से सी ++ कोड कैसे कॉल करें और शुरू करने के लिए मैं एक पर्ल स्क्रिप्ट से मूल सी ++ ऑब्जेक्ट बनाने की कोशिश कर रहा हूं।पर्ल एक्सएस अप्रयुक्त चर 'Perl___notused' चेतावनियां

ऐसा करने के लिए, मैं h2xs कमांड को क्रियान्वित शुरू कर दिया:

h2xs -A -nMyClass

तब मैं उत्पन्न Makefile.PL के लिए निम्न दो तर्क जोड़ा g++ संकलक उपयोग करने के लिए।

CC => 'g++', 
LD => 'g++', 

मैं .xs फ़ाइल में मेरी साधारण क्लास बनाया है और पर्ल में इसका मानचित्रीकरण

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) 

लिए XS कोड लिखा था तो मैं typemap फ़ाइल बनाई मैप करने के लिए पर्ल के लिए नया प्रकार।

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... 

अंदर किसी कृपया मुझे इन चेतावनियों का मूल कारण बता सकते हैं?

मैं पर्ल v5.10.1 और जी का उपयोग कर रहा ++ संस्करण 4.4.7

+3

इस प्रकार की कंपाइलर चेतावनियां * जब आप एक नए पेर्ल का उपयोग करते हैं तो * महत्वपूर्ण * बेहतर होता है (यानी अक्सर अपने आप गायब हो जाते हैं)। सी ++ के साथ संगतता भी सुधारती है। यदि किसी भी तरह से संभव है, तो हालिया रिलीज को स्थापित करने पर विचार करें, उदा। 'perlbrew' के माध्यम से। पर्ल 5.10.1 8 साल से अधिक पुराना है। – amon

+0

दुर्भाग्यवश मेरे पास केवल रेडहाट 6 :( – tjwrona1992

+0

पर बॉक्स के बाहर पर्ल के लिए उपलब्ध है, क्या आप पर्ल के बाद के संस्करण को इंस्टॉल नहीं कर सकते हैं? निश्चित रूप से आपको इंटरनेट या कुछ स्थानीय यम भंडार तक पहुंच प्राप्त करनी चाहिए? –

उत्तर

0

समाधान पर्ल के एक नए संस्करण का प्रयोग है। v5.10.1 बहुत पुराना है और ये समस्याएं बाद के संस्करणों में नहीं होती हैं।

मैं अपने स्वयं के प्रश्न का उत्तर पोस्ट कर रहा हूं क्योंकि टिप्पणियों में इसका उत्तर दिया गया था, लेकिन एक आधिकारिक उत्तर कभी पोस्ट नहीं किया गया था।

संबंधित मुद्दे