CMake中-O2选项来源及移除方法(openSUSE编译perl-BSSolv场景)
解决openSUSE 15.5构建perl-BSSolv RPM时-O2优化未移除的问题
可能的-O2来源及对应解决方法
1. RPM全局编译宏注入的优化选项
openSUSE的rpmbuild默认通过%optflags宏设置全局CFLAGS/CXXFLAGS,其中包含-O2,这个优先级高于CMakeLists.txt中的配置。
- 验证:执行
rpm --eval '%optflags',会输出默认编译参数,比如-O2 -g -m64 -mtune=generic。 - 解决:在.spec文件的
%build段开头,直接覆盖环境变量:
或者临时修改export CFLAGS="-O0 -g" export CXXFLAGS="-O0 -g"%optflags:%global optflags -O0 -g -m64 -mtune=generic
2. CMake构建类型自动叠加优化
如果rpmbuild调用cmake时指定了CMAKE_BUILD_TYPE=Release,CMake会自动为Release模式添加-O2,覆盖你在CMakeLists.txt中设置的选项。
- 解决:在.spec的
%build段的cmake命令中,强制指定调试模式和编译参数:cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS="-O0 -g" -DCMAKE_CXX_FLAGS="-O0 -g"
3. Perl模块构建工具的默认优化
perl-BSSolv作为perl扩展模块,可能使用ExtUtils::MakeMaker或Module::Build构建,这些工具会从perl配置或rpm的perl宏中继承CFLAGS。
- 解决:如果构建用
perl Makefile.PL,添加OPTIMIZE参数:
或者设置环境变量:perl Makefile.PL OPTIMIZE="-O0 -g"export PERL_MM_OPT="OPTIMIZE=-O0 -g"
4. CMake缓存文件残留
之前构建生成的CMakeCache.txt会保存旧的编译选项,导致新配置不生效。
- 解决:在
%build段开头清理构建目录:
或者用cmake的清理命令:rm -rf CMakeCache.txt CMakeFilescmake --build . --clean-first
验证优化是否移除
构建时添加-v参数查看编译命令:
rpmbuild -bb -v perl-BSSolv.spec
或者查看生成的二进制文件的编译参数:
readelf -p .comment /usr/lib/perl5/vendor_perl/auto/BSSolv/BSSolv.so
内容的提问来源于stack exchange,提问作者Mr.D
相关产品推荐
相关产品推荐

