news 2026/4/3 6:26:04

cmake_CMake定义属性define_property()与设置属性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cmake_CMake定义属性define_property()与设置属性

文章目录

  • 第二章 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=物理
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 4:59:37

GPT-SoVITS语音合成中断恢复机制研究

GPT-SoVITS语音合成中断恢复机制研究 在当前AI语音技术快速渗透日常生活的背景下&#xff0c;个性化语音合成已不再局限于大型科技公司的实验室。越来越多的开发者、内容创作者甚至普通用户开始尝试构建属于自己的“声音分身”。然而&#xff0c;现实往往不如理想顺畅——你花了…

作者头像 李华
网站建设 2026/4/3 5:04:44

Gephi图可视化终极指南:从零开始掌握网络分析利器

Gephi图可视化终极指南&#xff1a;从零开始掌握网络分析利器 【免费下载链接】gephi Gephi - The Open Graph Viz Platform 项目地址: https://gitcode.com/gh_mirrors/ge/gephi 想要快速上手专业的图可视化工具吗&#xff1f;Gephi作为开源图可视化平台的佼佼者&#…

作者头像 李华
网站建设 2026/3/12 14:07:25

高危漏洞突袭!n8n平台RCE危机:CVE-2025-68613

CVE-2025-68613作为n8n工作流自动化平台曝出的致命远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;以CVSS 3.1评分9.9的极高风险等级&#xff0c;成为近期开源自动化工具领域的重大安全隐患。该漏洞打破了工作流表达式评估的沙箱隔离机制&#xff0c;让已认证低权限用…

作者头像 李华
网站建设 2026/4/3 4:58:20

CVE-2025-8110深度剖析:Gogs 0day符号链接绕过攻防与未来防护启示

CVE-2025-8110作为Gogs自托管Git服务的高危零日漏洞&#xff0c;以CVSS 4.0评分8.7分的凌厉态势掀起全球网络安全风波。该漏洞本质是PutContents API对符号链接的处理缺陷&#xff0c;成功绕过CVE-2024-55947的路径限制防护&#xff0c;让低权限攻击者可实现任意文件写入并最终…

作者头像 李华
网站建设 2026/3/27 16:10:22

攻防演练生死时速:0Day/NDay破防危机下的应急自救全攻略

攻防演练季&#xff0c;0Day&#xff08;无公开补丁的未知漏洞&#xff09;与NDay&#xff08;公开未修复的已知漏洞&#xff09;是攻击方手中最锋利的“斩首利刃”。传统基于特征库的防火墙、杀毒软件在这类漏洞面前形同虚设——攻击方往往借助漏洞PoC&#xff08;概念验证代码…

作者头像 李华
网站建设 2026/3/27 0:37:58

现代化UI组件库国际化最佳实践:从架构设计到工程落地

现代化UI组件库国际化最佳实践&#xff1a;从架构设计到工程落地 【免费下载链接】tippyjs Tooltip, popover, dropdown, and menu library 项目地址: https://gitcode.com/gh_mirrors/ti/tippyjs 在全球化数字时代&#xff0c;现代化UI组件库的多语言支持已成为企业级应…

作者头像 李华