gpt4 book ai didi

makefile - 在make而不是bjam中使用boost.python

转载 作者:行者123 更新时间:2023-12-04 07:12:10 25 4
gpt4 key购买 nike

我只是想在不使用所有bjam魔术的情况下编译boost.python的“hello world”示例。我的boost.python安装正在运行,我确实使用bjam构建了示例并通过了测试套件。

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

因此,我的幼稚方法当然是将包含路径指向正确的 header ,并针对正确的库进行链接。我将boost python构建为系统布局,静态,运行时静态的,这意味着它只是位于/usr/local/lib中的libboost_python.a。

不幸的是,我在生成的.so库中得到了无法解析的外部符号。

这是我尝试从libs/python/example/tutorial/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链接libboost_python.a时,bjam的最大魔力是什么?
我没有得到 undefined symbol ,但是当我“用手”做这些符号时,会得到这些符号吗?

最佳答案

好吧,我真是愚蠢。要进行链接,必须将对象放在带符号的库之前。所以转

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

在我使用cxxflags = -fPIC重新编译boost.python之后,给了我预期的结果。

关于makefile - 在make而不是bjam中使用boost.python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com