You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CMake中基于文件名自动配置GCC编译选项?

在CMake中实现基于文件名自动生成依赖文件(.d)和列表文件(.lst)

你可以通过CMake生成器表达式实现类似Makefile的自动文件名匹配配置,无需逐个手动为源文件设置编译选项。以下是满足需求的CMake代码实现:

# 假设BUILD_DIR为你的构建目录,TARGET_NAME是目标可执行/库名称
target_compile_options(${TARGET_NAME} PRIVATE
    ${CC_FLAGS}
    # 生成汇编列表文件:自动将源文件的.c扩展名替换为.lst,输出到BUILD_DIR
    -Wa,-a,-ad,-alms="${BUILD_DIR}/$<SOURCE_FILE_BASE_NAME>.lst"
    # 生成依赖文件:自动将源文件的.c扩展名替换为.d,输出到BUILD_DIR
    -MMD -MP -MF="${BUILD_DIR}/$<SOURCE_FILE_BASE_NAME>.d"
)

代码说明

  • $<SOURCE_FILE_BASE_NAME> 是CMake的生成器表达式,会在生成构建系统时自动替换为当前编译的源文件的基础名称(比如编译src/foo.c时,会展开为foo),完美复刻Makefile中$<:.c=.lst>的替换逻辑。
  • -Wa,-a,-ad,-alms=... 告诉GCC生成汇编列表文件,指定输出到BUILD_DIR目录下;-MMD -MP -MF=... 则用于生成依赖文件,确保构建系统能正确追踪头文件依赖。

对比Makefile实现

你提供的Makefile规则:

%.o: %.c
    $(CC) -c $(CC_FLAGS) \
    -Wa,-a,-ad,-alms="$(BUILD_DIR)/$<:.c=.lst" \
    -MMD -MP -MF"$(BUILD_DIR)/$<:.c=.d" \
    $< -o $@

上述CMake代码实现了完全等价的效果:所有C源文件编译时,都会自动在BUILD_DIR下生成对应的.lst和.d文件,无需手动遍历或逐个配置源文件属性。

内容的提问来源于stack exchange,提问作者N. I.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:28:21