2011-08-25 20 views
7

के साथ हैलो वर्ल्ड तो मैं बूस्ट पायथन का उपयोग करके पाइथन 3.2 और सी ++ इंटरफेस करने की कोशिश कर रहा हूं, और कई सारे मुद्दों पर आ गया हूं। आखिरकार मैंने इसे 2.7 पुस्तकालयों का उपयोग करके संकलित करने के लिए प्राप्त किया है और यह काम करता है, लेकिन मुझे इसे पायथन 3.2 के साथ काम नहीं करना प्रतीत होता है।बूस्ट पायथन और पायथन 3.2

यहाँ C++ कोड

#include <iostream> 

using namespace std; 

void say_hello(const char* name) { 
    cout << "Hello " << name << "!\n"; 
} 

int main(){return 0;} 

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 
using namespace boost::python; 

BOOST_PYTHON_MODULE(hello) 
{ 
    def("say_hello", say_hello); 
} 

अगर मैं 2.7 पुस्तकालयों यह सिर्फ ठीक काम करता है का उपयोग कर इसे संकलित, लेकिन जब मैं 3.2 पुस्तकालयों का उपयोग मैं libboost_python.so

अन्यथा से अपरिभाषित संदर्भ की टन मिलता है मैं यह काम करने के लिए अजगर का एक छोटा सा लिखा है:

from distutils.core import setup 
from distutils.extension import Extension 

setup(name="PackageName", 
    ext_modules=[ 
     Extension("hello", ["testBoost.cpp"], 
     libraries = ["boost_python"]) 
    ]) 

और इस एक तो अजगर 3.2 या 2.7 निर्माण का उपयोग कर पैदा करेगा, लेकिन जब मैं अजगर 3 interpr खोलने eter और आयात करने का प्रयास करें ताकि यह मुझे libboost_python.so से फिर से त्रुटि अपरिभाषित प्रतीक PyClass_Type दे। कोई विचार? पाइथन 3.x के साथ संगत बूथ पायथन है?

जानकारी उपयोगी है, तो यहां मेरी प्रयास किया संकलन 3.2 का उपयोग कर रहा है:

$ g++ testBoost.cpp -I/usr/include/python3.2 -I/usr/local/include/boost/python -lboost_python -lpython3.2mu 
    /tmp/ccdmU1Yu.o: In function `PyInit_hello': 
    testBoost.cpp:(.text+0xc2): undefined reference to `boost::python::detail::init_module(PyModuleDef&, void (*)())' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_Size' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyFile_FromString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_Type' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyInt_Type' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_FromString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_FromStringAndSize' 
    /usr/local/lib/libboost_python.so: undefined reference to `Py_InitModule4_64' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_FromFormat' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyNumber_Divide' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyNumber_InPlaceDivide' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyInt_AsLong' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_InternFromString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyClass_Type' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_AsString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyInt_FromLong' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyFile_AsFile' 
    collect2: ld returned 1 exit status 

और अजगर 3 दुभाषिया से त्रुटि

File "<stdin>", line 1, in <module> 
ImportError: /usr/local/lib/libboost_python.so.1.47.0: undefined symbol: PyClass_Type 

किसी भी मदद के लिए धन्यवाद है!

+1

यदि आप सक्षम हैं, तो आप Boost.Python की बजाय SWIG को देखने पर विचार करना चाहेंगे।इसके लिए बहुत कम बॉयलरप्लेट कोड की आवश्यकता है और मुझे इसे आसानी से पहले Python3 के साथ काम करने के लिए मिला है। – Sean

+2

@ सेन मुझे यकीन नहीं है कि आप किस बॉयलरप्लेट कोड के बारे में बात कर रहे हैं; मेरा बूस्ट/पायथन अतिरिक्त कोड की केवल 5 लाइनों के साथ तैराकी से काम करता है। – steventrouble

उत्तर

5

ऊपर C++ कोड

$ g++ testBoost.cpp -I/usr/include/python3.2 -I/usr/local/include/boost/python -lboost_python3 -lpython3.2mu -o hello.so -shared 

यह संकलन आदेश -lboost_python3 जोड़ता है, और -shared, और यह भी के साथ एक मॉड्यूल में संकलित अजगर विस्तार मॉड्यूल के लिए नामकरण परंपरा। आपको python3-dev पैकेज भी इंस्टॉल करना चाहिए, और यदि आपने पहले से नहीं किया है, तो python3 के साथ बूस्ट कॉन्फ़िगर/बिल्ड/इंस्टॉल करें।

अजगर 3 में, मैं तो निम्न कर सकते हैं:

$ python3 
Python 3.2 (r32:88445, Mar 25 2011, 19:28:28) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import hello 
>>> hello.say_hello('bill') 
Hello bill! 
>>> 

आप उस बिंदु पर दौड़ के लिए रवाना होना चाहिए।

+1

मैंने -lboost_python3 का उपयोग करने की कोशिश की लेकिन अभी भी वही त्रुटि मिलती है, और मैंने पहले से ही अपनी जेम फ़ाइल को पाइथन 3 – Dwight

+1

पर इंगित करने के लिए बदल दिया है, इसलिए मैंने आपके निर्देशों के साथ संकलित किया, और यह मुझे बताया कि मुझे -फिक के साथ पुन: संकलित करने की आवश्यकता है, जो काम करता है , और मैं .so के साथ समाप्त हो गया। हालांकि, जब मैं पायथन में आयात करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है जो कहती है: ImportError: /usr/local/lib/libboost_python3.so.1.47.0: अपरिभाषित प्रतीक: PyClass_Type – Dwight

8

मुझे उबंटू 12.04 के साथ एक ही समस्या थी। मैंने पुस्तकालय के 1.48 संस्करण को स्थापित किया और libboost_python.so के बजाय libboost_python-py32.so से लिंक करना पड़ा इसके बाद लिंकर त्रुटियां चली गईं।

1

इस चर्चा वर्ष, बस रिकार्ड के लिए हालांकि:

./b2 clean 
./b2 --with-python link=static cxxflags="-std=c++11 -fPIC" variant=release stage 
./b2 --with-python link=static cxxflags="-std=c++11 -fPIC" variant=release install 

बाद में आदेश: संशोधित परियोजना config.jam अपने स्थापना के लिए अजगर संस्करण को बदलने के लिए

# Python configuration 
using python : 3.4 : /usr ; 

तब बढ़ावा निर्माण सुपर उपयोगकर्ता विशेषाधिकारों की आवश्यकता है। अपने अजगर वातावरण में

g++ -std=c++11 hellopy.cpp -I/usr/include/python3.4 -I/usr/local/include/boost/python -lboost_python3 -o hello.so -shared -fPIC 

फिर आप हैलो आयात कर सकते हैं: फिर विस्तार के लिए फ़ोल्डर सी युक्त ++ कोड के लिए चलते हैं।

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