[gelöst] Boost.python statisch gelinkt -> undefined symbol



  • Servus,

    ich versuche seit nunmehr zwei Tagen, boost.python unter openSUSE 11.3/64bit ans Laufen zu bekommen.

    Aktuell bin ich soweit, dass es zumindest in der shard-library variante läuft. Ich hätte aber gerne eine statische libboost_python.

    Zu dem Zweck baue ich mit

    ./bjam -q --layout=system --with-python toolset=gcc variant=release link=static threading=multi runtime-link=static
    

    Daraufhin habe ich eine libboost_python.a, die ist 700kb groß.

    Wenn ich jetzt das Hello-world example von /libs/python/example/tutorial bauen will, bleiben undefinierte symbole, obwohl ich BOOST_PYTHON_STATIC_LIB definiert habe:

    $ 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 -DBOOST_PYTHON_STATIC_LIB -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 _Unwind_Resume@@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 _ZTIPKc@@CXXABI_1.3
                     U _ZTIc@@CXXABI_1.3
                     U _ZTVN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
                     U _ZTVN5boost6python7objects21py_function_impl_baseE
                     U _ZdlPv@@GLIBCXX_3.4
                     U _Znwm@@GLIBCXX_3.4
                     U __cxa_atexit@@GLIBC_2.2.5
                     w __cxa_finalize@@GLIBC_2.2.5
                     U __cxa_guard_abort@@CXXABI_1.3
                     U __cxa_guard_acquire@@CXXABI_1.3
                     U __cxa_guard_release@@CXXABI_1.3
                     w __gmon_start__
                     U __gxx_personality_v0@@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
    

    Wenn ich stattdessen bjam den kompletten build machen lasse und die libboost_python.so (also die shared library) unter /usr/local/lib ablege, gehts.

    Ich hätte es aber gerne statisch!

    Gruß,
    Philipp



  • Tja, Blödheit...
    -lboost_python hello.o macht natürlich keinen Sinn.
    hello.o -lboost_python hingegen schon. Oh the humanity!

    Und man muss boost natürlich mit -fPIC kompilieren. Kaum macht mans richtig, funktionierts auch schon.

    Phil


Anmelden zum Antworten