2013-04-10 8 views
9

के साथ शुरू करने में सहायता चाहिए। मैं अपना पहला बूस्ट बनाने का प्रयास कर रहा हूं। पायथन उदाहरण।Boost.Python

#include <iostream> 
#include <boost/python.hpp> 

using namespace boost::python; 


class Hello { 

public: 
    std::string greet() { 
     std::cout << "Hello World" << std::endl; 
    } 
}; 


BOOST_PYTHON_MODULE(hello) 
{ 
    class_<Hello>("Hello") 
     .def("greet", &Hello::greet); 
} 

int main() { 
    std::cout << "Boost.Python Test" << std::endl; 
    Hello hello; 
    hello.greet(); 
    return 0; 
} 

संपादित करें: अजगर विकास हेडर, अनदेखा कर रहे थे के रूप में @cdhowie बताया गया है। मैंने आवश्यक हेडर फाइलें पाई हैं और शामिल की हैं। अब लिंकर शिकायत कर रहा है:

10:43:58 **** Build of configuration BoostPythonTest-DPar for project BoostPythonTest 

**** 
make all 
Building file: ../src/BoostPythonTest.cpp 
Invoking: GCC C++ Compiler 
/usr/local/bin/g++-4.7 -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I/usr/include -I/usr/local/Cellar/gcc/4.7.2/gcc/include/c++/4.7.2 -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/BoostPythonTest.d" -MT"src/BoostPythonTest.d" -o "src/BoostPythonTest.o" "../src/BoostPythonTest.cpp" 
Finished building: ../src/BoostPythonTest.cpp 

Building target: libBoostPythonTest-DPar.dylib 
Invoking: MacOS X C++ Linker 
/usr/local/bin/g++-4.7 -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config-3.3m -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib -L/usr/local/Cellar/boost/1.51.0/lib -std=c++11 -Xlinker -ldl -framework CoreFoundation -lpython3.3m -dynamiclib -o "libBoostPythonTest-DPar.dylib" ./src/BoostPythonTest.o -lpython3.3m -lboost_python-mt -lpython3.3 
Undefined symbols for architecture x86_64: 
    "boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from: 
     _PyInit_hello in BoostPythonTest.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [libBoostPythonTest-DPar.dylib] Error 1 

मैं पहले से ही -lpython3.3m -lboost_python-mt -lpython3.3 से लिंक किया है - और क्या याद आ रही है?

संपादित करें: मुझे लगता है कि मैंने python3.3-config सूचियों से जुड़ा हुआ है। लापता प्रतीकों की वजह से लिंकिंग अभी भी काम नहीं करती है।

उत्तर

12

जब यह विशेष लिंकर त्रुटि होती है, तो यह अक्सर पायथन 3.x हेडर फाइलों जैसे पायथन के एक संस्करण के खिलाफ एप्लिकेशन बिल्डिंग का परिणाम होता है, जबकि boost_python लाइब्रेरी को एक अंतर संस्करण के विरुद्ध बनाया गया था, जैसे कि 2। एक्स।

PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)()); 

और निम्न हस्ताक्षर जब अजगर 2.x के खिलाफ निर्माण:

boost/python/module_init.hpp में, init_module समारोह जब अजगर 3.x के खिलाफ निर्माण निम्नलिखित हस्ताक्षर हैं

PyObject* boost::python::detail::init_module(char const* name, void(*)()); 

के रूप में कर सकते हैं implementation में देखा जाना चाहिए, केवल एक ही कार्य Boost.Python लाइब्रेरी में मौजूद होगा। इस प्रकार, Boost.Python लाइब्रेरी को जोड़ा जा रहा है, और लिंकर केवल 3.x init_module फ़ंक्शन को हल करने में सक्षम नहीं होने के बारे में शिकायत कर रहा है, तो यह बहुत संभव है कि Boost.Python लाइब्रेरी को पायथन 2 के विरुद्ध बनाया गया था। एक्स संस्करण, जबकि अनुप्रयोग कोड पायथन 3.x हेडर फ़ाइलों के खिलाफ बनाया गया है। आप Boost.Python लाइब्रेरी के प्रतीकों को डंप करके इसे सत्यापित कर सकते हैं और init_module हस्ताक्षर की जांच कर सकते हैं।

इसे हल करने के लिए, पायथन के उसी संस्करण के साथ एप्लिकेशन का निर्माण करें जिससे बूस्ट.पथन बनाया गया था। इस मामले में, या तो:

  • पायथन 2.x शीर्षलेख फ़ाइलों के साथ एप्लिकेशन बनाएं और पायथन 2.x पुस्तकालयों के खिलाफ लिंक बनाएं।
  • बूस्ट का निर्माण करें। पायथन 3.x के खिलाफ पाइथन।This दस्तावेज बूस्ट बनाने के चरणों का वर्णन करता है, और this दस्तावेज Boost.Python के लिए विस्तार से चला जाता है। --with-python तर्क का उपयोग कर bootstrap प्रक्रिया के दौरान Boost.Python के खिलाफ बिल्डिंग निष्पादन योग्य को पाइथन निष्पादन योग्य रूप से प्रदान करना आवश्यक हो सकता है।
+0

मुझे विश्वास है कि आपने समस्या का सही ढंग से निदान किया है। अब मैं पाइथन 3.3 के खिलाफ बूस्ट। पायथन बनाने की कोशिश कर रहा हूं। – clstaudt

+0

जब मैं बूस्ट बनाने की कोशिश करता हूं। पायथन मुझे [निम्न त्रुटि] मिलती है (https://gist.github.com/anonymous/5433641)। 'gcc.link.dll ../../../../bin.v2/libs/python/build/gcc-4.2.1/debug/libboost_python.dylib ld: चेतावनी: निर्देशिका विकल्प के लिए नहीं मिली ' -एल/​​यूएसआर/स्थानीय/सेलर/पायथन 3/3.3.0/फ्रेमवर्क/पायथन। फ्रेमवर्क/संस्करण/3.3/lib/python3.3/config ' एलडी: अज्ञात विकल्प: -R संग्रह 2: एलडी 1 निकास स्थिति वापस लौटा' यहां क्या हो रहा है? – clstaudt

+1

@cls: यदि आप जीसीसी टूलचैन के ऐप्पल के संस्करण का उपयोग कर रहे हैं, तो टूलसेट को 'gcc' के बजाय 'डार्विन' के रूप में निर्दिष्ट करने का प्रयास करें। –

6

आप पाइथन विकास शीर्षलेख खो रहे हैं। आपके लिनक्स वितरण में उनके लिए एक पैकेज होना चाहिए। (उदाहरण के लिए, python-dev डेबियन या उबंटू पर।)

+1

त्रुटि को इंगित करने के लिए धन्यवाद। लेकिन मैं ओएसएक्स पर हूं, कोई विचार है कि हेडर कैसे प्राप्त करें? होमब्रू में एक सूत्र 'पायथन-देव' प्रतीत नहीं होता है। – clstaudt

+1

@cls मैं ओएस एक्स का उपयोग नहीं करता इसलिए मैं वहां कोई सलाह नहीं दे सकता। शायद कोई और कर सकता है। – cdhowie

+0

शीर्षलेख मिले, लेकिन लिंकर मुद्दे हैं और मैं उदाहरण काम करना चाहता हूं। – clstaudt

2

आप एक साझा लाइब्रेरी बना रहे हैं, क्योंकि यह एक बाइनरी पायथन मॉड्यूल है। इसके लिए, आपको -श्रेषित या गतिशील (दस्तावेज़ों की जांच करें) की आवश्यकता है और आपके पास मुख्य() फ़ंक्शन नहीं होना चाहिए।

आगे, अगर इससे मदद नहीं मिलती है और आपके पास अभी भी लिंकर त्रुटियां हैं, तो यह जानने के लिए "objdump -T --demangle/path/to/lib" का उपयोग करें, यह जानने के लिए कि पुस्तकालय में कौन से प्रतीक हैं और क्या आपके पास यह है कि जरुरत। "Ldd" के आउटपुट को भी देखें, जिसमें निर्भर साझा ऑब्जेक्ट्स सूचीबद्ध हैं। यह आपको एक संकेत दे सकता है कि पुस्तकालय या पुस्तकालयों को लिंक करना है।

मेरे सिस्टम पर, मेरे पास "पायथन-कॉन्फ़िगर" और "पायथन 2.7-कॉन्फ़िगर" नामक एक प्रोग्राम भी है। जांचें कि क्या आपके पास कुछ समान है, क्योंकि यह स्क्रिप्ट जानता है कि कौन से पुस्तकालय कम से कम पायथन के लिए लिंक करते हैं। एक समान उपकरण pkg-config है, जो अधिक सामान्य है और यह भी बढ़ावा देने के लिए जानकारी प्रदान कर सकता है।

+0

'python3.3-config' मुझे कुछ पथ और झंडे देता है जो मैंने जोड़ा है, लेकिन कोई प्रभाव नहीं (ऊपर कॉल देखें)। 'otool' (जो स्पष्ट रूप से ओएसएक्स के बराबर ओएसएक्स है) मुझे उदा। '$ otool -T libboost_python-mt.dylib libboost_python-mt.dylib: सामग्री की तालिका (0 प्रविष्टियां) मॉड्यूल इंडेक्स प्रतीक अनुक्रमणिका'। ओएसएक्स पर 'ldd' मौजूद नहीं प्रतीत होता है। – clstaudt

1

आपको बूस्ट सिस्टम के साथ-साथ लिंकर द्वारा उल्लिखित किसी अन्य पुस्तकालय से भी लिंक करना होगा। साथ ही, क्लैंग (https://svn.boost.org/trac/boost/ticket/7536) जैसे अन्य कंपाइलर्स आज़माएं, जो एक्सकोड (Latest Clang location in XCode 4.5) के साथ आता है। साथ ही, अपनी मेकफ़ाइल पोस्ट करने का प्रयास करें। एक और प्रयास बनाने के बजाय bjam/b2 का उपयोग करेगा।

2

यह सुनिश्चित नहीं है कि यह ऐसा करने का तरीका है, लेकिन ऐसा लगता है कि PY_VERSION_HEX गलत सेट है। क्या होता है आप

#define PY_VERSION_HEX 0x03300000 

अपने BoostPythonTest.cpp में boost.python हेडर से पहले तो क्या होगा?

+0

यह एक टिप्पणी है, उत्तर नहीं। –

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