同时指定-O2与-O3编译优化选项时实际生效的是哪一个?
实际生效的优化选项结论
对于Clang、GCC等主流C/C++编译器,同类互斥的编译参数遵循后出现覆盖前出现的规则,你场景中最终生效的是后出现的优化等级参数。绝大多数DKMS编译场景下,内核默认的-O2参数会排在前面,你手动配置的-O3在参数列表末尾,因此最终生效的是-O3。
为什么会同时存在两个参数
DKMS编译内核模块时会默认继承内核构建时预置的编译参数,主线Linux内核默认编译优化等级就是-O2,你在/etc/dkms/framework.conf中配置的CFLAGS属于追加参数,不会覆盖内核预置的参数,所以编译命令中会同时出现两个优化等级参数。
自行验证的方法
你可以通过两种方式确认当前环境下实际生效的参数:
- 给编译器增加
-Q --help=optimizers参数,编译时会打印所有优化开关的启用状态,可直接查看最终生效的优化等级 - 直接查看DKMS编译输出的完整命令行参数,两个优化等级参数中位置更靠后的就是生效的参数
避免歧义的配置建议
如果你担心参数顺序异常导致优化等级不符合预期,可以修改配置为强制把自定义优化参数放到参数列表最后:
# /etc/dkms/framework.conf export LLVM=1 export CC=clang export CFLAGS="$CFLAGS -O3 -march=native"
内容的提问来源于stack exchange,提问作者15 Volts
相关产品推荐
相关产品推荐

