😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」:点赞👍收藏⭐️评论📝
文章目录
- 1.概述
- 2.设置属性 - `set_property`
- 2.1基本语法
- 2.2示例
- 3.获取属性 - `get_property`
- 3.1基本语法
- 3.2示例
- 4.实例
- 4.1 demo1设定编译参数
- 4.2 demo2定义C++标准
- 4.3 demo3-设置编译器定义
- 5.实战使用技巧与注意事项
1.概述
在CMake中,属性管理是构建系统的核心部分。通过使用
set_property
和get_property
命令,开发者可以为目标、测试、源文件、目录及全局设置和获取属性。这些属性控制着构建过程和逻辑。
2.设置属性 - set_property
set_property
命令用于设置指定范围内的属性值。
2.1基本语法
set_property(<SCOPE> <NAME> <PROPERTY> <VALUE1> [VALUE2 ...])
<SCOPE>
:定义属性的作用域。这可以是GLOBAL
(全局范围)、DIRECTORY
(目录范围)、TARGET
(目标范围)、SOURCE
(源文件范围)、TEST
(测试范围)或CACHE
(缓存条目范围)。<NAME>
:指定属性所属的实体名称。例如,目标的名称或源文件的路径。<PROPERTY>
:要设置的属性名称。<VALUE1> [VALUE2 ...]
:要设置的属性值。
2.2示例
- 设置全局属性
set_property(GLOBAL PROPERTY GLOBAL_PROP "Some Value")
- 设置目标属性
add_executable(my_target main.cpp)
set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
- 设置目录属性
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY MY_DIR_PROP "Directory Value")
- 设置源文件属性
set_property(SOURCE src/main.cpp PROPERTY HEADER_FILE_ONLY TRUE)
- 设置测试属性
add_test(NAME my_test COMMAND my_executable)
set_property(TEST my_test PROPERTY LABELS "MyTestLabel")
- 设置缓存属性
set_property(CACHE MY_CACHE_VAR PROPERTY TYPE STRING)
3.获取属性 - get_property
get_property 命令在 CMake 中用于获取已定义属性的值。这个命令可以用来查询各种类型的属性,包括目标属性、测试属性、源文件属性等
3.1基本语法
get_property(<variable> <SCOPE> <ITEM_NAME> PROPERTY <PROPERTY_NAME>)
<variable>
:一个变量,用于存储获取到的属性值。<SCOPE>
:定义属性的作用域。这可以是GLOBAL
(全局范围)、DIRECTORY
(目录范围)、TARGET
(目标范围)、SOURCE
(源文件范围)、TEST
(测试范围)或CACHE
(缓存条目范围)。<NAME>
:指定属性所属的实体名称。例如,目标的名称或源文件的路径。PROPERTY <PROPERTY_NAME>
:要获取的属性名称。[SET]
:可选参数,如果指定,只有当属性被显式设置时,命令才会成功。
3.2示例
- 获取全局属性
get_property(my_global_value GLOBAL PROPERTY GLOBAL_PROP)
- 获取目标属性
get_property(my_target_std TARGET my_target PROPERTY CXX_STANDARD)
- 获取目录属性
get_property(my_dir_prop DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY MY_DIR_PROP)
- 获取源文件属性
get_property(header_only SOURCE src/main.cpp PROPERTY HEADER_FILE_ONLY)
- 获取测试属性
get_property(test_labels TEST my_test PROPERTY LABELS)
- 获取缓存属性
get_property(cache_type CACHE MY_CACHE_VAR PROPERTY TYPE)
4.实例
4.1 demo1设定编译参数
为一个可执行文件目标设置自定义的编译选项,并获取这些选项
- CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyExecutableProject)# 添加一个可执行文件
add_executable(MyExecutable main.cpp)# 为目标设置编译选项
set_property(TARGET MyExecutable PROPERTY COMPILE_OPTIONS "-Wall" "-O3")# 获取刚刚设置的属性
get_property(compiler_options TARGET MyExecutable PROPERTY COMPILE_OPTIONS)
message(STATUS "Compiler options for MyExecutable: ${compiler_options}")
4.2 demo2定义C++标准
设置全局属性以定义整个项目的C++标准,并获取该属性。
- CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(GlobalPropertyProject)# 设置全局属性
set_property(GLOBAL PROPERTY CMAKE_CXX_STANDARD 17)# 添加一个可执行文件
add_executable(MyExecutable main.cpp)# 获取全局属性
get_property(cxx_standard GLOBAL PROPERTY CMAKE_CXX_STANDARD)
message(STATUS "Global C++ standard: ${cxx_standard}")
4.3 demo3-设置编译器定义
为当前目录设置编译器定义,并获取这些定义
- CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DirectoryPropertyProject)# 添加一个可执行文件
add_executable(MyExecutable main.cpp)# 为当前目录设置编译器定义
set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS "MY_CUSTOM_DEFINITION")# 获取目录属性
get_property(dir_compile_defs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS)
message(STATUS "Compile definitions for current directory: ${dir_compile_defs}")
5.实战使用技巧与注意事项
- 合理组织属性:为不同的构建目标和文件设置合适的属性,以便更好地管理和维护项目。
- 全局属性管理:利用全局属性进行跨项目的配置共享。
- 缓存属性:使用
CACHE
选项来持久化跨多次构建的配置。 - 属性检查:在获取属性前,先检查属性是否已被定义。
- 属性名称大小写敏感:确保在设置和获取属性时使用正确的大小写。
- 避免名称冲突:选择独特的属性名称,以免与CMake内置属性或其他项目属性冲突。
- 了解属性继承机制:目录属性可以被其子目录继承。