2010-10-06 21 views
8

Sto solo cercando di compilare l'esempio "ciao mondo" di boost.python SENZA usare tutta la magia bjam. La mia installazione boost.python sta funzionando, ho creato con successo l'esempio con bjam e passato la suite di test.Usare boost.python con make al posto di bjam

Ora per il mio progetto ho bisogno di usare tutte queste cose in un ambiente Make normale. Non voglio eseguire il porting su un altro strumento di creazione.

Quindi il mio approccio ingenuo è ovviamente quello di puntare semplicemente il percorso di inclusione verso le intestazioni giuste e il collegamento con la libreria corretta. Ho costruito boost python come system-layout, static, runtime-static, il che significa che è solo un libboost_python.a che risiede in/usr/local/lib.

Sfortunatamente, ottengo simboli esterni non risolti nella libreria .so risultante.

Ecco il mio tentativo di costruire l'esempio da libs/python/esempio/tutorial/hello.cpp:

$ 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 

Allora, qual è la grande magia di bjam che quando i collegamenti bjam libboost_python.a ottengo nessun simbolo indefinito, ma quando lo faccio "a mano" ottengo questi?

+0

ho scoperto che l'accumulo bjam utilizza la libreria condivisa di Boost.Python. Quando distribuisco la libreria condivisa, funziona sopra. Ma ho sicuramente bisogno di una build statica. Quindi perché il collegamento di libboost_python.a produce simboli non definiti, dove funziona libboost_python.so? – Philipp

risposta

7

Beh, ero terribilmente stupido. Per collegare uno deve mettere l'oggetto PRIMA della libreria con i simboli. Così girando

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

in

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

mi ha dato il risultato atteso, dopo aver ricompilato Boost.Python con CXXFLAGS = -fPIC.

2

si potrebbe provare qualcosa di simile:

g++ -I/usr/include/python2.4 -fpic hello.cpp -shared -lboost_python -o libhello.so 
Problemi correlati