You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在支持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的编译选项:

  1. 在Boost源码根目录下创建user-config.jam文件
  2. 添加以下内容:
using gcc : 5.4 : g++-5 :
    <cxxflags>"-mno-avx -mno-avx2"
    <cflags>"-mno-avx -mno-avx2"
;
  1. 执行编译:
./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

火山引擎 最新活动