मैं सीख रहा हूं कि पर्ल से सी ++ कोड कैसे कॉल करें और शुरू करने के लिए मैं एक पर्ल स्क्रिप्ट से मूल सी ++ ऑब्जेक्ट बनाने की कोशिश कर रहा हूं।पर्ल एक्सएस अप्रयुक्त चर '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
इस प्रकार की कंपाइलर चेतावनियां * जब आप एक नए पेर्ल का उपयोग करते हैं तो * महत्वपूर्ण * बेहतर होता है (यानी अक्सर अपने आप गायब हो जाते हैं)। सी ++ के साथ संगतता भी सुधारती है। यदि किसी भी तरह से संभव है, तो हालिया रिलीज को स्थापित करने पर विचार करें, उदा। 'perlbrew' के माध्यम से। पर्ल 5.10.1 8 साल से अधिक पुराना है। – amon
दुर्भाग्यवश मेरे पास केवल रेडहाट 6 :( – tjwrona1992
पर बॉक्स के बाहर पर्ल के लिए उपलब्ध है, क्या आप पर्ल के बाद के संस्करण को इंस्टॉल नहीं कर सकते हैं? निश्चित रूप से आपको इंटरनेट या कुछ स्थानीय यम भंडार तक पहुंच प्राप्त करनी चाहिए? –