使用boost。用python代替bjam。

时间:2022-09-09 07:27:33

I'm just trying to compile the "hello world" example of boost.python WITHOUT using all the bjam magic. My boost.python installation is working, I did succesfully build the example with bjam and passed the test suite.

我只是想编译一个boost的“hello world”示例。python不使用所有的bjam魔法。我的提振。python安装是有效的,我成功地构建了bjam的示例并通过了测试套件。

Now for my project I need to use all this stuff in a plain Make environment. I don't want to port to another build tool.

现在,对于我的项目,我需要在一个普通的环境中使用所有这些东西。我不想移植到另一个构建工具。

So my naive approach is of course to just point the include path to the right headers and link against the right library. I built boost python as system-layout, static, runtime-static, which means it is just a libboost_python.a that resides in /usr/local/lib.

因此,我的朴素方法当然是指向正确的标题和链接指向正确的库。我构建了boost python作为系统布局、静态、运行时静态,这意味着它只是一个libboost_python。a位于/usr/local/lib。

Unfortunately, I get unresolved external symbols in the resulting .so library.

不幸的是,我在结果中得到了未解决的外部符号。

Here is my try to build the example from libs/python/example/tutorial/hello.cpp:

下面是我试图从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

So what is the big magic of bjam that when bjam links libboost_python.a I get no undefined symbols, but when i do it "by hand" i get these?

当bjam链接libboost_python时,bjam的最大魔力是什么?a我没有未定义的符号,但是当我用手做的时候,我得到了这些符号?

2 个解决方案

#1


7  

Well, I was obiously stupid. To link one has to put the object BEFORE the library with the symbols. So turning

我真是笨透了。要链接一个人,必须把物体放在图书馆前面的符号。所以把

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

into

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

Gave me the expected result, after I recompiled boost.python with cxxflags=-fPIC.

在我重新编译了boost之后,给出了预期的结果。python cxxflags = - fpic。

#2


2  

You could try something like this:

你可以试试这样的方法:

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

#1


7  

Well, I was obiously stupid. To link one has to put the object BEFORE the library with the symbols. So turning

我真是笨透了。要链接一个人,必须把物体放在图书馆前面的符号。所以把

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

into

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

Gave me the expected result, after I recompiled boost.python with cxxflags=-fPIC.

在我重新编译了boost之后,给出了预期的结果。python cxxflags = - fpic。

#2


2  

You could try something like this:

你可以试试这样的方法:

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