CMake中如何在其他目标中引用生成的可执行文件?
CMake中引用生成的可执行文件的正确方式
在CMake里引用生成的可执行文件,分两种场景处理最稳妥:
1. 处理add_executable生成的可执行文件
直接用生成器表达式$<TARGET_FILE:目标名称>就能拿到可执行文件的完整绝对路径,完全不用依赖系统PATH,CMake会自动处理不同平台的路径格式,还能保证该可执行文件先被构建完成。
示例代码:
# 定义生成器可执行目标 add_executable(MyGenerator generator.cpp) # 用生成器生成C文件 add_custom_command( OUTPUT generated.c COMMAND $<TARGET_FILE:MyGenerator> --input input.txt --output generated.c MAIN_DEPENDENCY input.txt DEPENDS MyGenerator # 显式依赖,确保MyGenerator先构建 )
2. 处理add_custom_target生成的可执行文件
这种场景没有现成的生成器表达式可用,需要手动指定可执行文件的绝对输出路径,同时在后续命令中引用这个路径,并添加正确的依赖关系:
示例代码:
# 明确指定生成的可执行文件的绝对路径 set(MY_GENERATED_TOOL ${CMAKE_CURRENT_BINARY_DIR}/MyGeneratedTool) # 自定义目标生成可执行文件 add_custom_target(MyName COMMAND whatever --output ${MY_GENERATED_TOOL} COMMAND it COMMAND takes VERBATIM DEPENDS some/file also/some/other/file ) # 使用生成的工具生成C文件 add_custom_command( OUTPUT generated.c COMMAND ${MY_GENERATED_TOOL} --input input.txt --output generated.c MAIN_DEPENDENCY input.txt DEPENDS MyName # 确保生成工具先完成构建 )
核心注意点
- 优先用
add_executable定义生成器目标,生成器表达式的方式最可靠,能避免路径和依赖的各种问题; - 如果必须用
add_custom_target生成工具,一定要用绝对路径(比如结合CMAKE_CURRENT_BINARY_DIR),不要用相对路径,防止构建时找不到文件; - 所有依赖必须显式声明,CMake不会自动推断这种自定义目标的依赖关系。
内容的提问来源于stack exchange,提问作者olh
相关产品推荐
相关产品推荐

