Boost.Python快速入门示例运行失败求助
我来帮你梳理几个针对性的排查方向,解决你在 Ubuntu 16.04 上遇到的 Boost.Python 测试全失败问题:
1. 先抓准测试失败的具体原因
bjam 默认的日志输出比较简略,建议重新运行时加上-d2参数打印详细日志:
bjam -d2
重点看每个测试失败的报错信息:是链接阶段的 undefined reference(比如找不到 Python/Boost 相关符号)、编译阶段的头文件缺失,还是运行时的库加载失败?这些细节是定位问题的核心。
2. 确认 Boost.Python 与 Python 3.5 的绑定是否真的正确
虽然 bjam 提示找到 Python,但很可能默认关联了系统的 Python 2.x。可以手动强制指定 Python 版本:
- 运行 bjam 时追加参数:
bjam python=3.5 - 或者检查/创建
~/.user-config.jam文件,明确指定 Python 3.5 的路径:using python : 3.5 : /usr/bin/python3.5 : /usr/include/python3.5m : /usr/lib/x86_64-linux-gnu ;
另外要确认:你编译 Boost 时是否指定了--with-python并关联 Python 3?部分旧版 Boost 默认只编译 Python 2 的绑定。
3. 检查 GCC 编译选项的兼容性
Ubuntu 16.04 的 GCC 5.4.0 默认启用 C++11,但部分 Boost.Python 测试可能依赖旧标准,或者存在警告转错误的问题:
- 尝试指定 C++ 标准运行 bjam:
bjam cxxflags="-std=c++11" - 如果遇到警告导致的失败,临时关闭警告转错误:
bjam cxxflags="-Wno-error"
4. 验证 Python 3.5 开发库是否完整
Ubuntu 下如果只装了python3.5而没装开发包,会出现头文件/链接库缺失:
sudo apt-get install python3.5-dev
安装后检查以下路径是否存在:
/usr/include/python3.5m(头文件目录)/usr/lib/x86_64-linux-gnu/libpython3.5m.so(动态库文件)
5. 排查运行时的库加载问题
有些测试编译通过但运行失败,大概率是动态库找不到:
- 临时设置环境变量加载 Boost 库:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # 假设Boost安装在/usr/local - 用
ldd检查测试生成的二进制文件依赖:ldd path/to/test_binary
如果输出里有not found的库,说明路径配置有问题。
6. 手动编译单个最小测试案例验证环境
从 Boost.Python 示例里挑最简单的hello world案例,手动写 Makefile 编译,排除 bjam 配置的干扰:
CC=g++ CFLAGS=-Wall -std=c++11 -I/usr/include/python3.5m -fPIC LDFLAGS=-lboost_python3 -lpython3.5m hello: hello.o $(CC) $(CFLAGS) -shared -o hello.so hello.o $(LDFLAGS) hello.o: hello.cpp $(CC) $(CFLAGS) -c hello.cpp -o hello.o
如果手动编译能成功并在 Python 中导入,说明问题出在 bjam 的配置上;如果手动也失败,那就是 Boost.Python 库本身没编译正确。
内容的提问来源于stack exchange,提问作者Ben Stringer

