导入Boost Python C++编写的Bond Python库时遇未定义符号错误求助
导入由Boost Python C++编写的Bond Python库时出现以下错误:
undefined symbol: _ZN5boost6python15instance_holder8allocateEP7_objectmmm
该错误对应的符号为:boost::python::instance_holder::allocate::object
我按照Bond官方Python示例操作,但文档未说明example.cpp的编译方法,我的编译命令如下:
g++ \ -I/home/myuser/source/adhoc_experiments/python_bond_poc/real_boost/boost_1_82_0/boost/ \ -I/home/myuser/.conda/envs/archexperiments/include/python3.9/ \ -I/usr/local/include/bond/ \ \ -L/home/myuser/.conda/envs/archexperiments/lib \ -L/usr/local/lib/bond \ \ example_types.cpp \ example_apply.cpp \ example.cpp \ \ -fPIC \ -shared \ \ -lpython3 \ -lpython3.9 \ -lboost_system \ -lboost_python39 \ -lboost_thread \ -lbond \ -lbond_apply \ \ -Wl,-soname,example -export-dynamic \ -o example.so
这个错误源于编译时Boost Python库的链接顺序、版本匹配问题,导致符号未被正确解析,具体修复步骤如下:
调整链接库顺序:GCC链接器按从左到右的顺序解析符号,依赖库需放在被依赖的源文件之后。将
-lboost_python39移至所有源文件之后,同时移除重复的-lpython3(保留-lpython3.9即可),避免版本冲突。调整后的编译命令链接部分示例:example_types.cpp \ example_apply.cpp \ example.cpp \ \ -fPIC \ -shared \ \ -lpython3.9 \ -lboost_system \ -lboost_thread \ -lbond \ -lbond_apply \ -lboost_python39 \验证Boost与Python版本匹配:确认你使用的Boost 1.82是针对Python 3.9编译的
boost_python39库。如果是自行编译Boost,需确保编译时指定了正确的Python路径(如通过--with-python=/path/to/python3.9参数);如果是预编译库,检查其版本是否对应Python 3.9。检查链接路径优先级:用
ldd example.so命令查看生成的example.so实际链接的Boost Python库路径,确认该路径下的libboost_python39.so是预期版本,避免系统中其他版本的Boost库干扰。添加必要编译宏:根据Boost库的类型(静态/动态)添加对应宏定义,比如使用动态库时添加
-DBOOST_ALL_DYN_LINK,静态库时添加-DBOOST_PYTHON_STATIC_LIB,确保编译时正确识别Boost Python的链接方式。
内容的提问来源于stack exchange,提问作者Seif Elsehely

