سؤال

أحاول فقط تجميع مثال "Hello World" لـ BOOST.Python دون استخدام كل سحر BJAM. يعمل تثبيت Boost.python الخاص بي ، لقد قمت ببناء المثال مع BJAM وتجاوزت جناح الاختبار.

الآن بالنسبة لمشروعي ، أحتاج إلى استخدام كل هذه الأشياء في بيئة رائعة. لا أريد نقل أداة إنشاء أخرى.

لذا فإن نهجي الساذج هو بالطبع توجيه المسار إلى الرؤوس اليمنى والربط مع المكتبة الصحيحة. لقد قمت ببناء Boost Python كطرف نظام ، ثابت ، في وقت التشغيل ، مما يعني أنه مجرد libboost_python.a الموجود في/usr/local/lib.

لسوء الحظ ، أحصل على رموز خارجية لم تحل في المكتبة الناتجة.

إليكم محاولة بناء المثال من LIBS/Python/مثال/تعليمي/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 _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

إذن ما هو السحر الكبير لـ BJAM الذي عندما يربط Bjam libboost_python.a لا أحصل على رموز غير محددة ، لكن عندما أفعل ذلك "باليد" أحصل على هذه؟

هل كانت مفيدة؟

المحلول

حسنًا ، كنت غبيًا. لربط المرء يجب أن يضع الكائن قبل المكتبة بالرموز. لذلك تحول

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

أعطاني النتيجة المتوقعة ، بعد أن قمت بإعادة تجميع boost.python مع cxxflags = -fpic.

نصائح أخرى

يمكنك تجربة شيء مثل هذا:

 g++  -I/usr/include/python2.4 -fpic  hello.cpp -shared -lboost_python -o libhello.so
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top