Mac OSX Catalina下Anaconda Python3.7.9环境使用boost_python编译时出现x86_64架构未定义符号问题求助
解决Boost.Python编译链接错误及警告问题
先处理Boost Bind的警告
那个警告是Boost库的占位符命名空间弃用提示,有两种解决方式:
- 方式一:在代码最开头定义宏
BOOST_BIND_GLOBAL_PLACEHOLDERS,兼容旧行为:#define BOOST_BIND_GLOBAL_PLACEHOLDERS #include <boost/python.hpp> // 其余代码不变 - 方式二:改用新的头文件和命名空间,修改include部分:
#include <boost/bind/bind.hpp> #include <boost/python.hpp> using namespace boost::placeholders;
两种方式选其一即可消除警告。
核心:解决链接符号缺失错误
你遇到的_PyUnicode_Type和__Py_NoneStruct都是Python C API的核心符号,属于Python标准库——你的编译命令里只链接了boost_python37,但没链接Python本身的库,所以链接器找不到这些符号。
修改编译命令
针对Anaconda环境下的Python 3.7.9,你需要在编译时添加Python库的链接参数:
g++ -fPIC -Wall \ -I/Users/whitebear/anaconda3/envs/aiwave/include \ -I/Users/whitebear/anaconda3/envs/aiwave/include/python3.7m \ -L/Users/whitebear/anaconda3/envs/aiwave/lib \ -lboost_python37 -lpython3.7m \ -shared -o whatModule.so what.cpp
或者更简便的方式,直接用Python的config工具自动获取编译和链接参数,避免手动写路径出错:
g++ -fPIC -Wall \ $(/Users/whitebear/anaconda3/envs/aiwave/bin/python3.7m-config --cflags) \ $(/Users/whitebear/anaconda3/envs/aiwave/bin/python3.7m-config --ldflags) \ -lboost_python37 \ -shared -o whatModule.so what.cpp
为什么这样有效?
-lpython3.7m告诉链接器要链接Python 3.7的动态库,这样那些缺失的C API符号就能被找到。-L指定了Anaconda环境下Python库的路径,确保链接器能找到libpython3.7m.dylib。- 使用
python3.7m-config --cflags和--ldflags可以自动获取当前Python环境的编译选项和链接选项,比手动写路径更可靠,尤其是当你切换Anaconda环境时。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

