You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:32:58