如何在CMake管理的C项目中为指定单个源文件添加编译器优化标志
CMake 单个源文件单独设置编译优化flag的正确方案
你之前的配置没有生效是因为set_source_files_properties的写法存在两处错误:缺少PROPERTIES关键字,且使用了错误的属性名。
正确配置方法
直接替换你原来的错误配置即可:
cmake_minimum_required(VERSION 3.10) project(zc_dec C) set(CMAKE_C_STANDARD 11) # 全局默认开低优化+调试信息,方便其他文件调试 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g") add_executable(zc_dec abs.c abs.h bin2dec.c bin2dec.h circshift.c circshift.h ZCNET_detec_pkt.c ZCNET_detec_pkt.h # 其余源文件 . . . ) # 仅为核心文件ZCNET_detec_pkt.c单独添加O3优化 set_source_files_properties(ZCNET_detec_pkt.c PROPERTIES COMPILE_FLAGS "-O3" ) target_link_libraries(zc_dec m fftw3 m)
注意事项
- 修改CMake配置后需要清空构建缓存,重新加载CMake项目再编译,旧的缓存配置会导致新设置不生效,CLion中可以点击顶部菜单
文件 -> 重新加载CMake项目完成刷新。 - 如果需要兼容MSVC等其他编译器,可以增加编译器判断逻辑:
if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") set(OPT_FLAG "-O3") elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC") set(OPT_FLAG "/O2") endif() set_source_files_properties(ZCNET_detec_pkt.c PROPERTIES COMPILE_FLAGS ${OPT_FLAG} )
- 你也可以选择不用改CMake的方案:在
ZCNET_detec_pkt.c的最开头(所有include语句之前)添加编译器专属的优化指令,GCC/Clang下写法如下:
#pragma GCC optimize ("O3")
该方案和编译器强绑定,兼容性弱于CMake配置方案。
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

