2010-10-06 21 views
8

Po prostu próbuję skompilować przykład "boost.python" bez użycia całej magii bjam. Moja instalacja boost.python działa, z powodzeniem zbudowałem przykład z bjam i zdałem testowy pakiet.Używanie boost.python z make zamiast bjam

Teraz dla mojego projektu muszę użyć wszystkich tych rzeczy w prostym środowisku Make. Nie chcę przenosić do innego narzędzia do kompilacji.

Tak więc moim naiwnym podejściem jest po prostu wskazanie ścieżki dołączania do właściwych nagłówków i połączenie z odpowiednią biblioteką. Zbudowałem podpowiedź python jako system-layout, static, runtime-static, co oznacza, że ​​jest to tylko libboost_python.a, który znajduje się w/usr/local/lib.

Niestety, otrzymuję nierozwiązane symbole zewnętrzne w wynikowej bibliotece .so.

Oto moja próba zbudować przykład z libs/python/example/poradnik/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 

Więc co jest wielka magia bjam że gdy linki bjam libboost_python.a otrzymuję brak niezdefiniowanych symboli, ale kiedy robię to "ręcznie" otrzymuję je?

+0

okazało się, że budowa bjam korzysta z udostępnionej biblioteki boost.python. Kiedy wdrażam bibliotekę współużytkowaną, powyższe działa. Ale zdecydowanie potrzebuję statycznej budowy. Dlaczego więc łączenie libboost_python.a daje niezdefiniowane symbole, gdzie działa libboost_python.so? – Philipp

Odpowiedz

7

Cóż, byłem obraźliwie głupi. Aby połączyć, należy umieścić obiekt PRZED biblioteką z symbolami. Więc obracając

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

do

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

Dał mi oczekiwanego rezultatu, po tym jak zrekompilowane boost.python z CXXFLAGS = -fPIC.

2

można spróbować coś takiego:

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