news 2026/7/6 3:12:09

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/7/4 15:08:37

【Open-AutoGLM manus深度解析】:揭秘下一代自动化代码生成引擎核心技术

第一章&#xff1a;Open-AutoGLM manus 技术演进与核心定位Open-AutoGLM manus 作为新一代开源自动化生成语言模型框架&#xff0c;致力于在多任务场景下实现零样本迁移与自适应推理能力的深度融合。其设计哲学强调模块化架构与可扩展性&#xff0c;支持从轻量级边缘部署到大规…

作者头像 李华
网站建设 2026/7/1 19:55:10

49927美元的精准猎杀:Scripted Sparrow的全球化BEC攻击帝国与防御突围

当一封看似来自“高管领导力培训机构”的邮件出现在企业应付账款人员的收件箱&#xff0c;附带伪造的高管沟通记录和接近5万美元的发票时&#xff0c;很少有人能意识到&#xff0c;这是一场横跨三大洲的工业化诈骗陷阱的开端。2024年年中被Fortra FIRE团队锁定的Scripted Sparr…

作者头像 李华
网站建设 2026/6/26 5:56:20

Open-AutoGLM 沉思版下载与部署实战(从零到运行仅需3步)

第一章&#xff1a;Open-AutoGLM 沉思版下载与部署概述Open-AutoGLM 沉思版是一款面向企业级自动化推理场景的开源大语言模型工具&#xff0c;专为高精度任务理解与多轮逻辑推演设计。其核心优势在于融合了思维链&#xff08;Chain-of-Thought&#xff09;机制与动态上下文感知…

作者头像 李华
网站建设 2026/7/3 19:37:51

springboot中小企业设备管理系统(11569)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/7/6 0:54:48

EdB Prepare Carefully:5分钟教你打造完美RimWorld开局阵容 [特殊字符]

厌倦了RimWorld开局时那些技能混乱、装备不匹配的随机殖民者&#xff1f;EdB Prepare Carefully模组正是为你量身打造的终极解决方案&#xff01;这个功能强大的模组让你在游戏开始前就能对殖民者进行全方位精细调整&#xff0c;彻底告别随机化的无奈。&#x1f3af; 【免费下载…

作者头像 李华
网站建设 2026/6/19 20:27:43

Steam Deck Windows驱动深度解析:技术实现与高级配置指南

Steam Deck Windows驱动&#xff08;SWICD&#xff09;作为一款专为解决Steam Deck内置控制器在Windows系统兼容性问题的用户模式驱动程序&#xff0c;通过虚拟XBox 360控制器技术实现了完整的输入映射功能。本文将从技术架构、核心特性、配置策略三个维度深入解析这一开源项目…

作者头像 李华