使用别名目标在CMake

Using alias targets in CMake

本文关键字:CMake 目标 别名      更新时间:2023-10-16

定义CMake目标时,可以创建别名目标,以便在后续命令中使用别名引用已定义的目标。例如

add_library(foo_lib foo.cpp bar.cpp bat.cpp)
add_library(foo::lib ALIAS foo_lib)

据我所知,这样做的好处是名称foo_lib不会作为make目标出现。但是,给定这样一个别名,我想为它们设置各种属性,例如:

set_target_properties(foo::lib PROPERTIES COMPILE_DEFINITIONS ...)
target_include_directories(foo::lib PUBLIC ... PRIVATE ...)

,但不幸的是,这是不可能的,因为CMake Error: set_target_properties不能用于ALIAS目标。我不明白为什么这不应该是可能的,因为我想定义我的lib的名称一次,并引用给定的别名每当我想调整目标的属性。任何提示如何使用别名目标"正确"?ALIAS目标除了不显示为Make目标之外还有什么用途?

ALIAS类似于"同义词"。ALIAS target只是original的另一个名称。所以要求ALIAS目标是不可修改的——你不能调整它的属性,安装它,等等。

创建别名的一种可能的情况是:有一个目标,它的在概念上与不同,但它的实际上与相同(例如,在特定的配置中):
if(FOO_USE_SHIPPED)
    add_library(FOO ...) # Library FOO shipped with our project
endif()
...
# We need FOO_test for testing
if(FOO_USE_SHIPPED)
    add_library(FOO_test ALIAS FOO) # Use our library
else()
    add_library(FOO_test IMPORTED)
    set_target_property(FOO_test ...) # Use external library
endif()