如何使用CMake生成器表达式$ <TARGET_FILE:tgt>?

wl2*_*776 23 cmake

我无法理解我做错了什么.我总是得到字符串"$<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}")
Run Code Online (Sandbox Code Playgroud)

这是我的src/CMakeLists.txt

add_library(tgt1 a.c)
Run Code Online (Sandbox Code Playgroud)

文件a.c已创建且为空

我尝试了以下生成器:Visual Studio 2013 Win64,Ninja和MingW Makefile.我已经使用Android工具链进行了最后两次,从这里下载

我希望最后一个message(STATUS命令可以打印到库的完整路径.但是,所有变体都会打印字符串$<TARGET_FILE:tgt1>.

Rei*_*ica 44

(当CMake的是解析CMakeLists,执行像命令发生器表达式并不是在配置时评价add_target()message()等等).这时,发电机表达式仅仅是一个字符串-字符$,然后<,然后T,然后......

生成器表达式的评估发生在生成时(这就是它们被称为"生成器表达式"的原因).在解析和处理所有CMake代码之后生成时间,并且CMake开始对其中的数据进行操作以生成构建系统文件.只有这样才能获得评估生成器表达式所需的所有信息.

因此,您只能将生成器表达式用于生成时或更晚生成的事物(例如构建时).一个人为的例子是这样的:

add_custom_target(
  GenexDemo
  COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:tgt1>"
  VERBATIM
)
Run Code Online (Sandbox Code Playgroud)

在配置时,CMake会将文字字符串记录$<TARGET_FILE:tgt1>为参数COMMAND.然后在生成时(当tgt1每个配置的位置已知并且保证不再更改时),它将替换它用​​于生成器表达式.