bjam

2010-10-06 8 views
8

के बजाय boost.python का उपयोग करके मैं बस bjam जादू का उपयोग किए बिना boost.python के "हैलो वर्ल्ड" उदाहरण को संकलित करने का प्रयास कर रहा हूं। मेरी boost.python स्थापना काम कर रही है, मैंने सफलतापूर्वक बीजेएम के साथ उदाहरण बनाया और परीक्षण सूट पारित किया।bjam

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

तो मेरा बेवकूफ दृष्टिकोण सही है कि सही हेडर के पथ को शामिल करें और सही लाइब्रेरी के खिलाफ लिंक शामिल करें। मैंने सिस्टम-लेआउट, स्थिर, रनटाइम-स्टेटिक के रूप में बूस्ट पायथन बनाया, जिसका अर्थ है कि यह सिर्फ एक libboost_python.a है जो/usr/local/lib में रहता है।

दुर्भाग्यवश, मुझे परिणामी .so लाइब्रेरी में अनसुलझे बाहरी प्रतीकों मिलते हैं।

$ cat hello.cpp 
// Copyright Joel de Guzman 2002-2004. Distributed under the Boost 
// Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt 
// or copy at http://www.boost.org/LICENSE_1_0.txt) 
// Hello World Example from the tutorial 
// [Joel de Guzman 10/9/2002] 

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

$ g++ -I/usr/local/include -I/usr/include/python -fpic -c -o hello.o 
hello.cpp 
$ g++ -shared -Wl,-soname,"libhello.so" -L/usr/local/lib -lboost_python -fpic -o libhello.so hello.o 
$ nm -u libhello.so 
       U PyString_Type 
       w _Jv_RegisterClasses 
       U _Py_NoneStruct 
       U [email protected]@GCC_3.0 
       U _ZN5boost6python6detail11init_moduleEPKcPFvvE 
       U _ZN5boost6python6detail12gcc_demangleEPKc 
       U 
_ZN5boost6python6detail17scope_setattr_docEPKcRKNS0_3api6objectES3_ 
       U 
_ZN5boost6python7objects15function_objectERKNS1_11py_functionE 
       U _ZN5boost6python7objects21py_function_impl_baseD2Ev 
       U _ZN5boost6python9converter19do_return_to_pythonEPKc 
       U _ZN5boost6python9converter8registry5queryENS0_9type_infoE 
       U 
_ZNK5boost6python7objects21py_function_impl_base9max_arityEv 
       U 
_ZNK5boost6python9converter12registration25expected_from_python_typeEv 
       U _ZTIN5boost6python7objects21py_function_impl_baseE 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       U _ZTVN5boost6python7objects21py_function_impl_baseE 
       U [email protected]@GLIBCXX_3.4 
       U [email protected]@GLIBCXX_3.4 
       U [email protected]@GLIBC_2.2.5 
       w [email protected]@GLIBC_2.2.5 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       w __gmon_start__ 
       U [email protected]@CXXABI_1.3 
$ python 
>>> import libhello 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: ./libhello.so: undefined symbol: 
_ZNK5boost6python7objects21py_function_impl_base9max_arityEv 

तो bjam के बड़े जादू जब bjam लिंक libboost_python.a मैं कि क्या है:

यहाँ मेरी से libs/अजगर/उदाहरण/ट्यूटोरियल/hello.cpp उदाहरण बनाने की कोशिश है कोई अपरिभाषित प्रतीकों, लेकिन जब मैं इसे "हाथ से" करता हूं तो मुझे ये मिलता है?

+0

मैंने पाया कि bjam निर्माण boost.python की साझा लाइब्रेरी का उपयोग करता है। जब मैं साझा लाइब्रेरी, उपरोक्त कार्यों को तैनात करता हूं। लेकिन मुझे निश्चित रूप से एक स्थिर निर्माण की जरूरत है। तो libboost_python.a उपज परिभाषित क्यों करता है, जहां libboost_python.so काम करता है? – Philipp

उत्तर

7

ठीक है, मैं बेहद बेवकूफ था। लिंक करने के लिए पुस्तकालय से पहले ऑब्जेक्ट को प्रतीक के साथ रखना होगा। तो

g++ -shared -Wl,-soname,"libhello.so" -L/usr/local/lib -lboost_python -fpic -o libhello.so hello.o 

मोड़

g++ -shared -Wl,-soname,"libhello.so" -L/usr/local/lib hello.o -lboost_python -fpic -o libhello.so 

में मुझे उम्मीद परिणाम दिया, के बाद मैं साथ cxxflags = -fPIC boost.python कंपाइल।

2

आप कुछ इस तरह की कोशिश कर सकते:

g++ -I/usr/include/python2.4 -fpic hello.cpp -shared -lboost_python -o libhello.so 
संबंधित मुद्दे