cmake_CMake定义属性define_property()与设置属性
2026/7/8 15:08:17 网站建设 项目流程

文章目录

  • 第二章 CMake基础语法
    • 2.18 CMake定义属性define_property()与设置属性
      • 2.18.1 定义属性 define_property
      • 2.18.2 设置属性 set_property()
      • 2.18.3 获取属性get_property
      • 2.18.4 代码测试
    • 2.19 set_target_properties()命令设置目标属性
      • 2.19.1 CMAKE设置获取TARGET的属性
      • 2.19.2 DIRECTORY属性
      • 2.19.3 SOURCE 属性

本文介绍define_property()和set_target_properties()。

第二章 CMake基础语法

2.18 CMake定义属性define_property()与设置属性

CMake属性(PROPERTY)是影响构建过程的关键概念,它们定义了如何编译源文件、二进制文件的安装位置以及安装程序的打包目录等。
CMake属性可以附加到不同的对象上,例如目标(TARGET)、目录(DIRECTORY)、源文件(SOURCE)、缓存变量(CACHE)、安装(INSTALL)、测试(TEST)等。

2.18.1 定义属性 define_property

使用define_property 命令来自定义属性,语法如下:

define_property(<范围类型>PROPERTY 属性名[INCLUDE][BRIEF_DOCS][FULL_DOCS][INITIALIZE_FROM_VARIABLE])

范围类型

GLOBAL:关联一个全局范围; DIRECTORY:关联一个目录; TARGET:关联一个目标; SOURCE:关联一个源文件; TEST:关联一个测试; VARIABLE:关联一个变量; CACHED_VARIABLE:关联一个缓存变量;

2.18.2 设置属性 set_property()

使用set_property() 命令来设置属性值。

set_property(范围[APPEND][APPEND_STRING]PROPERTY 属性名 属性值)

范围值:

GLOBAL:关联一个全局范围; DIRECTORY:关联一个目录; TARGET:关联一个目标; SOURCE:关联一个源文件; TEST:关联一个测试; VARIABLE:关联一个变量; CACHED VARIABLE:关联一个缓存变量;

属性值:

GLOBAL:范围是全局的并且不可接受名称。 DIRECTORY:范围默认是当前目录,或指定完整或相对路径命名。 TARGET:范围可以指定零个或多个现有目标; SOUCRE:范围可以命名零个或多个源文件。 INSTALL 范围可以命名零个或多个已安装的文件路径。 TEST:范围仅限于调用命令的目录。它可能会命名零个或多个现有测试, CHCHE 范围必须命名零个或多个现有缓存变量。

2.18.3 获取属性get_property

使用get_property命令来获取属性值,语法如下

get_property(变量名<范围>PROPERTY 属性名[选项])

范围设置:

GLOBAL 范围是全局的并且不接受名称。

选项:

SET 变量将被设置布尔值,指示该属性是否被设置;DEFINED 变量将被设置布尔值,指示该属性是否被define_property()定义 BRIEF_DOCS 变量将被设置为define_property()包含所请求属性的简短文档的字符串。 FULL DOCS 变量将被设置为define property0)包含所请求属性的详细文档的字符串。

2.18.4 代码测试

测试目录:

cmake_minimum_required(VERSION3.30)# 项目project(sourceCmake VERSION1.2LANGUAGES CXX)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug CACHE STRING"选择编译类型"FORCE)endif()message("CMAKE_BUILD_TYPE =${CMAKE_BUILD_TYPE}")# CMAKE_BUILD_TYPE = Debugadd_executable(A a.cpp)add_executable(B b.cpp)# 定义一个属性ProjectA,并设置简短文档描述为 "project1 brief docs",详细文档描述为 "project1 full docs"define_property(TARGET PROPERTY projectA BRIEF_DOCS"这是简单描述"FULL_DOCS"这是详细描述")#为目标a 设置 属性 project1,属性值为"a is project1"set_property(TARGET A PROPERTY projectA"A is project")# 获取目标a的project1属性值,并存放在v1中get_property(v1 TARGET A PROPERTY projectA)message("获取属性值 v1=${v1}")# 获取属性值 v1=A is project

2.19 set_target_properties()命令设置目标属性

CMAKE 在set_property() get_property() 基础上,提供了更多方便命令设置于获取属性。
范围:
获取和设置TARGET的属性:

set_target_properties get_target_property

获取和设置DIRECTORY的属性:

set_directory_properties 和 get_directory_property

获取和设置SOURCE

set_source_files_properties 和 get_source_file_properties

设置TEST 属性:

set_tests_properties 和 get_test_properties

2.19.1 CMAKE设置获取TARGET的属性

使用set_target_properties命令来设置TARGET范围属性,语法:

set_target_properties(<目标1><目标2>… PROPERTIES<属性名1><属性值1><属性名2><属性值2>)

使用get_target_property命令获取TARGET范围属性,语法:

get_target_property(<变量><目标><属性名>)

测试内容:测试目录结构如下:

a.c

#include <stdio.h>//入口函数 intmain(){printf("AAA!\n");return0;}

b.c

#include <stdio.h>//入口函数 intmain(){printf("BBB!\n");return0;}

sub目录下的CMakeLists.txt

cmake_minimum_required(VERSION3.29)# 项目信息project(subhhh)# 获取当前目录的属性值get_directory_property(d1 Pro1)get_directory_property(d2 Pro2)get_directory_property(d3 Pro3)message("获取当前目录的属性值 d1=${d1}d2=${d2}d3=${d3}")# 获取当前目录的属性值 d1=语文 d2= d3=

测试 TARGET

# 最低版本要求cmake_minimum_required(VERSION3.29)# 项目信息project(hhh)# 生成可执行文件add_executable(a a.c)add_executable(b b.c)message("--------------------测试TARGET属性----------------------")# 设置目标a和b,定义三个属性,属性值为 音乐,美术,数学set_target_properties(a b PROPERTIES Pro1 音乐 Pro2 美术 Pro3 数学)# 获取a的Pro1属性值get_target_property(v1 a Pro1)# 获取b的Pro2属性值get_property(v2 TARGET a PROPERTY Pro2)# 获取目标b的Pro3属性值get_target_property(v3 b Pro3)message("属性值为 v1=${v1}v2=${v2}v3=${v3}")# 属性值为 v1=音乐 v2=美术 v3=数学

2.19.2 DIRECTORY属性

使用set_directory_properties命令设置当前目录和子目录的属性,语法:

set_directory_properties(PROPERTIES<属性名1><属性值1><属性名2><属性值2>)

使用get_directory_properties命令获取DIRECTORY范围属性,语法:

get_directory_property(变量<dir><属性名>)

测试:

message("------------------------测试DIRECTORY属性----------------------")# 为当前目录定义一个Pro1属性, 可继承,在子目录中可以访问define_property(DIRECTORY PROPERTY Pro1 INHERITED)# 设置当前目录和子目录的多个属性值set_directory_properties(PROPERTIES Pro1 语文 Pro2 英语 Pro3 物理)# 添加子目录add_subdirectory(sub)# 获取当前目录的Pro1属性值,放入d1中get_directory_property(d1 Pro1)# 获取当前目录(DIRECTORY .)的Pro2属性值,放入d2中get_property(d2 DIRECTORY.PROPERTY Pro2)# 获取当前目录Pro3 放入d3中get_directory_property(d3 DIRECTORY.Pro3)message("获取属性值 d1=${d1}d2=${d2}d3=${d3}")# 获取属性值 d1=语文 d2=英语 d3=物理

2.19.3 SOURCE 属性

使用set_source_files_properties 命令设置SOURCE范围的属性,语法如下:

set_source_files_properties(<files>[directort<dir>]PROPERTIES<属性名1><属性值1><属性名2><属性值2>)

使用get_source_property 命令获取SOURCE范围属性,语法如下:

get_source_files_property()

测试:

message("-------------------------测试SOURCE属性----------------------")# 为a.c 和 b.c 设置三个属性值set_source_files_properties(a.c b.c PROPERTIES Pro1 语文 Pro2 英语 Pro3 物理)# 获取文件属性值get_source_file_property(v1 a.c Pro1)get_property(v2 SOURCE a.c PROPERTY Pro2)get_source_file_property(v3 b.c Pro3)message("获取属性值 v1=${v1}v2=${v2}v3=${v3}")# 获取属性值 v1=语文 v2=英语 v3=物理

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询