CMake中file(GENERATE)的TARGET选项及$<TARGET_FILE>表达式用法疑问
搞定CMake 3.19里file(GENERATE)的TARGET选项
先弄明白它的用途
TARGET选项就是给那些必须绑定具体目标才能解析的生成器表达式提供上下文的。比如$<TARGET_PROPERTY:...>、$<COMPILE_FEATURES:...>这类表达式,你得告诉CMake要基于哪个目标来解析,TARGET就是干这个的——直接填目标的真实名称就行。
正确用法示例
示例1:生成包含目标输出名称的文件
假设你已经定义了一个叫my_app的可执行目标,要生成一个记录它输出文件名的文本文件:
add_executable(my_app main.cpp) # 正确写法:TARGET直接填目标名my_app,配合$<TARGET_PROPERTY>解析 file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/app_info.txt" CONTENT "App output name: $<TARGET_PROPERTY:OUTPUT_NAME>" TARGET my_app )
这里TARGET指定my_app后,CMake就能正确解析$<TARGET_PROPERTY:OUTPUT_NAME>,把my_app的输出文件名写入生成的文件。
示例2:导出目标的编译特性
如果有个静态库my_lib,要把它用到的编译特性写到文件里:
add_library(my_lib STATIC lib.cpp) target_compile_features(my_lib PRIVATE cxx_std_17) file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/lib_features.txt" CONTENT "Compile features: $<COMPILE_FEATURES:my_lib>" TARGET my_lib )
$<COMPILE_FEATURES:my_lib>需要TARGET指定my_lib作为上下文,生成的文件里就会列出该目标启用的编译特性。
你之前报错的原因
- 填空字符串
'':TARGET必须指定一个已存在的有效目标,空字符串没有任何上下文,CMake根本不知道要解析哪个目标的表达式。 - 填
$<TARGET_FILE>这类表达式:TARGET选项要的是目标的名称字符串,不是生成器表达式。$<TARGET_FILE>本身是可以直接用的表达式,但把它写在TARGET里完全是用错地方了。 - 填了不存在的目标名:如果指定的目标还没创建(比如没写
add_executable/add_library)或者名字拼错,CMake找不到目标,自然会报错。
额外注意事项
- TARGET只对依赖目标的生成器表达式有用,像
$<CONFIG>这种不需要绑定目标的普通表达式,完全不需要加TARGET选项。 - 一定要保证TARGET指定的目标在
file(GENERATE)之前已经定义好,不然CMake会说找不到目标。
内容的提问来源于stack exchange,提问作者Krazer
相关产品推荐
相关产品推荐

