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?
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