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

使用CMake add_custom_command生成icons.c文件失败问题求助及解决验证

问题根源分析:子目录CMake配置失效的核心原因

你的问题本质是CMake对相对路径的基准目录规则、生成文件的跟踪逻辑导致的,下面分几个关键点拆解:

1. 子目录中add_custom_command的输出路径默认指向子构建目录

当你在icons子目录的CMakeLists.txt中写这段代码时:

add_custom_command(
    OUTPUT icons.c
    COMMAND ${PBRES} -c icons.c -4 "*/*.bmp"
)
  • CMake会把生成的icons.c放到子目录的构建目录(比如项目构建根目录是build/,文件实际路径是build/icons/icons.c),而不是源码目录icons/下。
  • 但你用target_sources(iconLib PRIVATE icons.c )时,CMake会默认去当前源码目录(也就是icons/)找这个文件——这里根本不存在现成的icons.c,自然会报"找不到源文件"的错误。

2. 主目录配置能正常运行的原因

移到主CMakeLists.txt后,你指定了OUTPUT icons/icons.c:

add_custom_command(
    OUTPUT icons/icons.c
    COMMAND ${PBRES} -c icons/icons.c -4 "icons/*/*.bmp"
)
  • 此时CMake的当前二进制目录是项目根构建目录build/,生成的文件路径是build/icons/icons.c。
  • 更重要的是,这个相对路径是相对于主构建目录的,CMake会自动把这个生成文件和iconLib目标关联起来,明白这是一个需要动态生成的文件,而非去源码目录找现成文件。

3. 子目录方案的修正方法(可选)

如果想保留子目录的结构,不需要把命令移到主目录,只要明确路径基准即可:

# icons/CMakeLists.txt 修改后代码
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/icons.c
    COMMAND ${PBRES} -c ${CMAKE_CURRENT_BINARY_DIR}/icons.c -4 "${CMAKE_CURRENT_SOURCE_DIR}/*.bmp"
)
target_sources(iconLib PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/icons.c )
  • 用CMAKE_CURRENT_BINARY_DIR明确指定生成文件到子构建目录,同时在target_sources中使用同一路径,让CMake清晰跟踪到这个生成文件的位置。
  • 把*/*.bmp换成${CMAKE_CURRENT_SOURCE_DIR}/*.bmp,避免PBRES命令执行时因为工作目录默认是构建目录,找不到源码里的图片文件。

内容的提问来源于stack exchange,提问作者Skeeve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:07:41