CMake入门教程【核心篇】属性管理set_property和get_property

在这里插入图片描述

😈「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_propertyget_property命令,开发者可以为目标、测试、源文件、目录及全局设置和获取属性。这些属性控制着构建过程和逻辑。

set_property
get_property
Apply
Retrieve
CMakeLists.txt
Set Property
Get Property
Build Target
Build Information

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.实战使用技巧与注意事项

  1. 合理组织属性:为不同的构建目标和文件设置合适的属性,以便更好地管理和维护项目。
  2. 全局属性管理:利用全局属性进行跨项目的配置共享。
  3. 缓存属性:使用CACHE选项来持久化跨多次构建的配置。
  4. 属性检查:在获取属性前,先检查属性是否已被定义。
  5. 属性名称大小写敏感:确保在设置和获取属性时使用正确的大小写。
  6. 避免名称冲突:选择独特的属性名称,以免与CMake内置属性或其他项目属性冲突。
  7. 了解属性继承机制:目录属性可以被其子目录继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA设计时序约束十五、Set_Bus_Skew

目录 一、序言 二、Set Bus Skew 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 报告分析 三、工程示例 3.1 工程代码 3.2 时序报告 四、参考资料 一、序言 在时序约束中&#xff0c;对时钟的约束除了set clock latency,set clock uncertainty,set input jitter外&…

merge发生冲突时 ☞ 撤销merge

场景&#xff1a;merge发生冲突时☞撤销merge 1. git checkout dev 2. git pull origin release 3. 发生冲突git merge --abort git reset --hard HEAD git reset --hard 8ec554Further Reading &#xff1a;Git常用命令汇总

【C语言数据结构】堆排序讲解

>>知识传送站&#xff1a; 排序算法&#xff1a;堆排序【图解代码】_哔哩哔哩_bilibili 一.代码部分&#xff1a; //堆排序 #include<stdio.h> #include<stdlib.h> #include<string.h> void swap(int* a,int* b)//用于换位 {int tamp;tamp*a;*a*b;*…

51、全连接 - 特征的全局融合

Resnet50 中的核心算法,除了卷积、池化、bn、relu之外,在最后一层还有一个全连接。 下图是 Resnet50 网络结构结尾的部分,最后一层 Gemm(通用矩阵乘法)实现的就是全连接操作。而矩阵乘法我们之前介绍过,传送门在:矩阵乘。 卷积也好,矩阵乘法也好,其目的都是为了完成神…

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介

目录 引言 Stream 类型 Geospatial 类型 HyperLogLog 类型 Bitmaps 类型 Bitfields 类型 引言 Redis 最关键&#xff08;应用广泛、频繁使用&#xff09;的五个数据类型 StringListHashSetZSet 下文介绍的数据类型一般适合在特定的场景中使用&#xff01; Stream 类型 St…

Redis命令---Hash(哈希)篇 (超全)

目录 1.Redis Hmset 命令 - 同时将多个 field-value (域-值)对设置到哈希表 key 中。简介语法可用版本: > 2.0.0返回值: 如果命令执行成功&#xff0c;返回 OK 。 示例 2.Redis Hmget 命令 - 获取所有给定字段的值简介语法可用版本: > 2.0.0返回值: 一个包含多个给定字段…

MySQL:CRUD,函数以及unionunion all

一. CRUD 1. SELECT(查询) 基础查询&#xff1a; select 查询列表 from 表名&#xff1a;从表中查询。 查询列表可以是表中的字段、常量、表达式和函数等。 查询的结果是一个虚拟的表格。 查询多个字段&#xff0c;在查询列表中用逗号隔开。 *可以表示所有字段。 select dist…

LangChain与昇腾

LangChain这个词今年已经听烂了&#xff0c;今天基于昇腾的角度总结一下&#xff1a; Why LangChain &#xff1f; 场景&#xff1a;构建一个LLM应用 在构建一个新项目时&#xff0c;可能会遇到许多API接口、数据格式和工具。要去研究每一个工具、接口很麻烦。 假设要构建一…

k8s二进制部署2

部署 Worker Node 组件 //在所有 node 节点上操作 #创建kubernetes工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} #上传 node.zip 到 /opt 目录中&#xff0c;解压 node.zip 压缩包&#xff0c;获得kubelet.sh、proxy.sh cd /opt/ unzip node.zip chmod x kubelet.…

3分钟了解syscall系统调用|详细易懂的流程

文章目录 syscall1.简介2.详细解释3.具体举例4.比喻解释5.作用6.优点7.总结 syscall和int 0x80有什么不同&#xff1f;1. 上下文切换效率2. 指令执行流程3. 兼容性总结 syscall 具体流程1. 用户空间准备2. 执行syscall指令3. 切换到内核态4. 内核模式下执行系统调用5. 返回用户…

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处&#xff1a; 众所周知CPU是用来处理游戏的逻辑运算的&#xff0c;而GPU是用来处理游戏中图像的。在GPU中&#xff0c;我们要绘制一个图像需要提交图片&#xff08;纹理&#xff09;到显存&#xff0c;然后再进行绘制&#xff08;在这个过程中会产生一次DrawCall…

html websocket的基本使用

html websocket的基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"w…

【投稿】计算机-AI相关期刊/会议了解和推荐

期刊 CCF相关推荐期刊 Artificial Intelligence (AI) AI领域的旗舰刊,人家都叫AI了好叭。身边有小伙伴半年给了大修,三个审稿人,其中有两个看的非常非常详细,问了许多问题,要加一堆实验(我觉得就是相当于重做了)。大修审稿周期给了半年(我算是知道为什么顶刊都这么慢…

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统&#xff08;完整项目&#xff09; 前言1、搭建步骤及方法2、集成多种插件功能&#xff0c;实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结&#xff1a; 前言…

Python实现观察者模式

观察者模式是一种设计模式&#xff0c;其中一个对象&#xff08;称为主题&#xff09;维护一组依赖于它的对象&#xff08;称为观察者&#xff09;&#xff0c;当主题的状态发生变化时&#xff0c;它会通知所有观察者。这种模式常用于实现分布式事件处理系统。 下面是一个简单…

Scikit-Learn线性回归(三)

Scikit-Learn线性回归三&#xff1a;综合实践 1、线性回归理论回顾2、数据分析与问题提出3、简单线性回归实践4、多项式回归实践5、多元线性回归实践 1、线性回归理论回顾 2、数据分析与问题提出 3、简单线性回归实践 4、多项式回归实践 5、多元线性回归实践

C. Perfect Square(矩形旋转之后对应的坐标)

题目&#xff1a; https://codeforces.com/contest/1881/problem/C 思路&#xff1a; 旋转之后对应的坐标&#xff1a; 顺时针旋转 0 90 180 270 分别为&#xff08;i&#xff0c;j&#xff09;&#xff08;j&#xff0c;n1-i&#xff09;&#xff08;n1-i&#xff0c;n1-j&…

LeetCode每日一题 | 2397. 被列覆盖的最多行数

文章目录 题目描述问题分析程序代码&#xff08;Golang 版本&#xff09; 题目描述 原题链接 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 …

C语言,easyx,绘制一个五边形。

#include<stdio.h> #include<easyx.h>//图形库头文件 #include<math.h>//使用三角函数引用头文件 #define PI 3.14//要使用弧度制 int main() { initgraph(800,600);//创建一个窗口&#xff0c;宽度为800&#xff0c;高度为600 setorigin(400, 300);//以…