我无法理解我做错了什么。
我总是得到字符串$<TARGET_FILE:tgt1>
而不是图书馆的路径。
我创建了虚拟项目。
这是我的根CMakeLists.txt
cmake_minimum_required (VERSION 3.0) # also tried 2.8 with the same result
set(PROJECT_NAME CMP0026)
add_subdirectory(src)
set(TGT_PATH $<TARGET_FILE:tgt1>)
message(STATUS "${TGT_PATH}")
这是我的src / CMakeLists.txt
add_library(tgt1 a.c)
文件a.c
已创建且为空
我尝试了以下生成器:Visual Studio 2013 Win64,Ninja和MingW Makefile。我从最后两个使用Android工具链,从here
下载我希望最后一个message(STATUS
命令可以打印到库的完整路径。但是,所有变体都会打印字符串$<TARGET_FILE:tgt1>
。
答案 0 :(得分:40)
在配置时不评估生成器表达式(当CMake解析CMakeLists,执行add_target()
或message()
等命令时)。此时,生成器表达式只是一个文字字符串 - 字符$
后跟<
,然后T
,然后......
生成器表达式的评估发生在 generate 时(这就是为什么它们被称为“生成器表达式”)。在解析和处理所有CMake代码之后生成时间,并且CMake开始对其中的数据进行操作以生成构建系统文件。只有然后才能获得评估生成器表达式所需的所有信息。
因此,您只能将生成器表达式用于生成时或之后发生的事情(例如构建时)。一个人为的例子是:
add_custom_target(
GenexDemo
COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:tgt1>"
VERBATIM
)
在配置时,CMake会将文字字符串$<TARGET_FILE:tgt1>
记录为COMMAND
的参数。然后在生成时(当每个配置知道tgt1
的位置并且保证不再更改时),它将替换它用于生成器表达式。