在CMake中,属性被用来存储信息。它类似于变量,但是附加到其他实体上,如目录或目标。例如,全局属性可以是一个有用的非缓存的全局变量。
在CMake的属性中,目标属性(Target Properties)扮演着尤为重要的角色,它们直接关联到最终生成的可执行文件、库文件等构建产物。
更直观地说,如果将目标类比为类(Class),那么目标属性则类似类成员(Class Member)。
生成目标
生成目标的方式有三种:
#生成可执行文件目标test
add_executable(test test.cpp)
#生成共享库目标test_lib
add_library(test_lib SHARED test.cpp)
#生成静态库目标test_lib
add_library(test_lib STATIC test.cpp)
定义目标属性
给目标定义属性的命令为:
define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
TEST | VARIABLE | CACHED_VARIABLE>
PROPERTY <name> [INHERITED]
[BRIEF_DOCS <brief-doc> [docs...]]
[FULL_DOCS <full-doc> [docs...]]
[INITIALIZE_FROM_VARIABLE <variable>])
在范围内定义一个属性,用于set_property()和get_property()命令。它主要用于定义属性的初始化或继承方式。从历史上看,该命令还将文档与属性相关联,但这不再被视为主要用例。
示例:
# 定义一个目标属性 TEST_TARGET,带有简短和详细描述
define_property(TARGET PROPERTY TEST_TARGET
BRIEF_DOCS "A test property"
FULL_DOCS "A long description of this test property"
)
设置目标属性
给目标设置属性的命令为:
set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
SOURCE [<src1> ...]
[DIRECTORY <dirs> ...]
[TARGET_DIRECTORY <targets> ...] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
[APPEND] [APPEND_STRING]
PROPERTY <name> [<value1> ...])
在范围的零个或多个对象上设置一个属性。
其中,有一个专用于设置目标属性命令:
set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
示例:
# 设置目标 TEST_TARGET 的属性 P_1 和 P_2 的值 set_target_properties(TEST_TARGET PROPERTIES P_1 "这是属性P_1的值" P_2 "这是属性P_2的值" )
获取目标属性
获取目标的属性的命令为:
get_property(<variable>
<GLOBAL |
DIRECTORY [<dir>] |
TARGET <target> |
SOURCE <source>
[DIRECTORY <dir> | TARGET_DIRECTORY <target>] |
INSTALL <file> |
TEST <test> |
CACHE <entry> |
VARIABLE >
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
其中,有一个专用于获取目标属性命令:
get_target_property(<VAR> target property)
示例:
# 获取目标 TEST_TARGET 的属性 P_1 的值,并将其存储在变量 TEST_TARGET_P1 中 get_target_property(TEST_TARGET_P1 TEST_TARGET P_1)
最后完整测试一遍:
# 要求 CMake 最低版本为 3.16
cmake_minimum_required(VERSION 3.16)
# 定义项目名称为 PROPERTY_TEST,版本号为 1.0,使用 C++ 语言
project(PROPERTY_TEST VERSION 1.0 LANGUAGES CXX)
# 添加一个名为 TEST_TARGET 的可执行文件,其源文件为 test.cpp
add_executable(TEST_TARGET test.cpp)
# 定义一个目标属性 TEST_TARGET,带有简短和详细描述
define_property(TARGET PROPERTY TEST_TARGET
BRIEF_DOCS "A test property"
FULL_DOCS "A long description of this test property"
)
# 设置目标 TEST_TARGET 的属性 P_1 和 P_2 的值
set_target_properties(TEST_TARGET PROPERTIES
P_1 "这是属性P_1的值"
P_2 "这是属性P_2的值"
)
# 获取目标 TEST_TARGET 的属性 P_1 的值,并将其存储在变量 TEST_TARGET_P1 中
get_target_property(TEST_TARGET_P1 TEST_TARGET P_1)
# 打印变量 TEST_TARGET_P1 的值
message("TEST_TARGET_P1: ${TEST_TARGET_P1}")
CMake 输出如下:
结语
最后,属性在CMake中是可继承的。这意味着,如果一个目标继承了另一个目标的属性,那么它将自动获得父目标的属性值。这种继承关系在构建大型项目时非常有用,因为它减少了重复的配置。
CMake的属性系统是一个强大的工具,它提供了细粒度的控制,允许我们定制构建过程。通过合理使用属性,我们可以创建更加灵活和可维护的构建系统。掌握属性的使用,是每个CMake用户进阶的必经之路,希望这篇文章能够帮助你更好地理解和使用CMake的属性系统。
项目链接(多多star呀..⭐_⭐):
Github 地址: https://github.com/mengps/LearnCMake
标签:游戏攻略