如何在支持AVX的Ubuntu机器上编译不带AVX/AVX2的Boost?
禁用AVX/AVX2编译Boost 1.66(GCC 5.4 + Ubuntu)
刚好有过类似的编译调试经验,针对你的场景,这里有几个直接有效的方法,都是适配Boost 1.66和GCC 5.4组合的:
方法1:通过环境变量全局指定编译参数
GCC本身支持通过-mno-avx和-mno-avx2编译选项禁用对应指令集,你可以先设置环境变量,再执行Boost的编译流程:
# 设置编译参数,禁用AVX/AVX2 export CXXFLAGS="-mno-avx -mno-avx2" export CFLAGS="-mno-avx -mno-avx2" # 初始化Boost构建系统 ./bootstrap.sh --with-toolset=gcc # 开始编译(可按需添加--prefix指定安装路径等参数) ./b2
如果之前编译过Boost,建议先执行./b2 clean清理旧的目标文件,避免残留的AVX指令代码影响结果。
方法2:直接给b2传递编译参数
不想修改全局环境变量的话,可以直接在调用b2时指定cxxflags参数,灵活性更高:
# 初始化bootstrap ./bootstrap.sh --with-toolset=gcc # 编译时直接传入禁用指令集的参数 ./b2 cxxflags="-mno-avx -mno-avx2" cflags="-mno-avx -mno-avx2"
这种方式仅对本次Boost编译生效,不会干扰其他项目的编译环境。
方法3:修改Boost的user-config.jam配置文件
如果需要长期固定这个编译配置,可以创建或修改user-config.jam文件,指定GCC 5.4的编译选项:
- 在Boost源码根目录下创建
user-config.jam文件 - 添加以下内容:
using gcc : 5.4 : g++-5 : <cxxflags>"-mno-avx -mno-avx2" <cflags>"-mno-avx -mno-avx2" ;
- 执行编译:
./bootstrap.sh --with-toolset=gcc ./b2 toolset=gcc-5.4
验证是否成功禁用
编译完成后,可用objdump检查生成的库文件是否包含AVX/AVX2指令:
objdump -d libboost_xxxx.so | grep -i avx
如果没有输出,说明已成功禁用AVX相关指令集。
内容的提问来源于stack exchange,提问作者Humam Helfawi




