当前位置: 首页 > news >正文

CMake 开发者手册

CMake 开发者手册

  • CMake 开发者手册
    • 一、介绍
    • 二、cmake 访问 Windows 注册表
      • 2.1 cmake 查询 Windows 注册表
      • 2.2 cmake 使用 Windows 注册表查找
    • 3. find_package 查找模块
      • 3.1 cmake 查找模块的示例用法
      • 3.2 标准变量名称
      • 3.3 find_package 一个简单的查找模块示例
  • 六、其他文章推荐

CMake 开发者手册

一、介绍

本手册供开发者参考,适用于处理 cmake-language(7) 代码的开发者,无论是编写自己的模块、创建自己的构建系统,还是参与 CMake 本身的开发。

二、cmake 访问 Windows 注册表

CMake 提供了一些功能以在 Windows 平台上访问注册表。

2.1 cmake 查询 Windows 注册表

从 CMake 3.24 版本开始,cmake_host_system_information() 命令允许查询本地计算机上的注册表。有关更多信息,请参见 查询 Windows 注册表。

2.2 cmake 使用 Windows 注册表查找

同样在 CMake 3.24 版本中,find_file()find_library()find_path()find_program()find_package() 命令的 HINTSPATHS 选项允许在 Windows 平台上查询注册表。

使用 BNF 语法,注册表查询的正式语法如下:

registry_query: '[' sep_definition? root_key : ((key_separator sub_key)? (value_separator value_name)?)? ']'
sep_definition: '{' value_separator '}'
root_key: 'HKLM' | 'HKEY_LOCAL_MACHINE' | 'HKCU' | 'HKEY_CURRENT_USER' | 'HKCR' | 'HKEY_CLASSES_ROOT' | 'HKCC' | 'HKEY_CURRENT_CONFIG' | 'HKU' | 'HKEY_USERS'
sub_key: element (key_separator element)*
key_separator: '/' | '\'
value_separator: element | ';'
value_name: element | '(default)'
element: character+
character: <任何字符,除 key_separator 和 value_separator>

sep_definition 可选项允许指定用于分隔 sub_keyvalue_name 的字符串。如果未指定,则使用字符 ;。可以在路径中指定多个 registry_query 项。

例如使用默认分隔符:

find_file(... PATHS "/root/[HKLM/Stuff;InstallDir]/lib[HKLM\\\\Stuff;Architecture]")

指定不同分隔符的例子:

find_library(... HINTS "/root/[{|}HKCU/Stuff|InstallDir]/lib[{@@}HKCU\\\\Stuff@@Architecture]")

如果未指定 value_name 项或其名称为 (default),将返回默认值的内容(如果存在)。支持的 value_name 类型包括:

  • REG_SZ
  • REG_EXPAND_SZ(返回的数据已展开)
  • REG_DWORD
  • REG_QWORD

当注册表查询失败时,通常是因为键不存在或数据类型不受支持,字符串 /REGISTRY-NOTFOUND 会被替代到 [] 查询表达式中。

3. find_package 查找模块

“查找模块”是指一个 Find<PackageName>.cmake 文件,在调用 find_package() 命令时加载。查找模块的主要任务是确定某个包是否可用,设置 <PackageName>_FOUND 变量以反映这一点,并提供使用该包所需的变量、宏和导入目标。

传统方法是使用变量来表示所有内容,包括库和可执行文件;这也是大多数现有 CMake 提供的查找模块所采用的方式。更现代的做法则是尽量像配置文件包那样工作,提供导入目标,这样可以将目标使用要求传播给消费者。

无论使用哪种方式(甚至提供变量和导入目标),查找模块应保持与旧版本的向后兼容性。

3.1 cmake 查找模块的示例用法

find_package(Foo [major[.minor[.patch[.tweak]]]][EXACT] [QUIET] [REQUIRED][[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][NO_POLICY_SCOPE])

有关 find_package() 的详细信息,请参考文档。

3.2 标准变量名称

在使用变量的方法中,以下变量名称应保持一致性,以便于查找模块之间的互操作性。所有变量都以 Xxx_ 开头,必须与 FindXxx.cmake 文件的名称完全匹配,包括大小写。

  • Xxx_INCLUDE_DIRS:最终的包含目录集合,供客户端代码使用。
  • Xxx_LIBRARIES:用于该模块的库。
  • Xxx_DEFINITIONS:用于编译使用该模块的代码时的编译定义。
  • Xxx_EXECUTABLE:可执行文件的完整绝对路径。
  • Xxx_LIBRARY_DIRS:供客户端代码使用的最终库目录集合。
  • Xxx_FOUND:当 find_package() 命令返回时,如果模块被认为成功找到,则此变量将被设置为 true

3.3 find_package 一个简单的查找模块示例

创建一个查找模块的过程如下:

  1. 模块文档:在模块的顶部添加许可证说明,接着是一个空行,然后是一个 reStructuredText 格式的文档注释块。

    # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
    # file Copyright.txt or https://cmake.org/licensing for details.#[=======================================================================[.rst:
    FindFoo
    -------Finds the Foo library.Imported Targets
    ^^^^^^^^^^^^^^^^This module provides the following imported targets, if found:``Foo::Foo``
    The Foo library
    ...
    #]=======================================================================]
    
  2. 查找库:尝试使用 pkg-config 查找库信息。

    find_package(PkgConfig)
    pkg_check_modules(PC_Foo QUIET Foo)
    
  3. 查找路径和库

    find_path(Foo_INCLUDE_DIR NAMES foo.h PATHS ${PC_Foo_INCLUDE_DIRS} PATH_SUFFIXES Foo)
    find_library(Foo_LIBRARY NAMES foo PATHS ${PC_Foo_LIBRARY_DIRS})
    
  4. 使用 FindPackageHandleStandardArgs

    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(Foo FOUND_VAR Foo_FOUND REQUIRED_VARS Foo_LIBRARY Foo_INCLUDE_DIR VERSION_VAR Foo_VERSION)
    
  5. 导入目标设置

    if(Foo_FOUND AND NOT TARGET Foo::Foo)add_library(Foo::Foo UNKNOWN IMPORTED)set_target_properties(Foo::Foo PROPERTIESIMPORTED_LOCATION "${Foo_LIBRARY}"INTERFACE_INCLUDE_DIRECTORIES "${Foo_INCLUDE_DIR}")
    endif()
    
  6. 标记高级变量

    mark_as_advanced(Foo_INCLUDE_DIR Foo_LIBRARY)
    

通过上述步骤,开发者可以创建一个有效的 CMake 查找模块,简化库的查找和链接过程,同时保持与 CMake 其他模块的一致性和兼容性。这种模块化的方式可以提高代码的可重用性和可维护性。希望本手册对您的开发工作有所帮助!

六、其他文章推荐

  1. CMakeLists.txt从入门到精通(看这篇就够)
  2. Cmake中Debug 、 Release 、RelWithDebInfo和 MinSizeRel类型说明
  3. cmake构建动态库实例(cmakelist)
  4. C++构建简单静态库实例(cmakelist)

相关文章:

CMake 开发者手册

CMake 开发者手册 CMake 开发者手册一、介绍二、cmake 访问 Windows 注册表2.1 cmake 查询 Windows 注册表2.2 cmake 使用 Windows 注册表查找 3. find_package 查找模块3.1 cmake 查找模块的示例用法3.2 标准变量名称3.3 find_package 一个简单的查找模块示例 六、其他文章推荐…...

Redis入门:在Java程序中高效使用Redis

准备工作 下载windows版的Redis&#xff08;自行查找网络资源&#xff09; 解压到指定文件夹 如图所示&#xff1a;Redis的目录结构 redis本质上也是一个数据库&#xff0c;只不过经常被用作缓存 。redis分为服务端和客户端&#xff0c;先启动服务器redis-server&#xff0c;在…...

活着就好20241021

今日提醒&#xff1a;2024年10月21日&#xff0c;星期一&#xff0c;已是开工第247天。早安&#xff0c;摸鱼界的同仁们&#xff01; 健康警钟&#xff1a;即便工作繁忙&#xff0c;也别忘了关爱自己。起身走走&#xff0c;茶水间、厕所、廊道都是好去处&#xff0c;毕竟&…...

阿里字节技术管理岗位面试要求

在阿里巴巴等互联网公司&#xff0c;技术管理岗&#xff08;如技术团队负责人 TL 或 P8/P9 级别的职位&#xff09;面试具有较高的技术要求和管理能力的考核。面试的问题和侧重点通常包括技术深度、架构设计、团队管理、项目推动等多方面。以下是一些常见的面试问题类型、侧重点…...

MySQL !=NULL 与IS NOT NULL

1、! 与<>比较 在MySQL中 ! 和 <> 的功能一致&#xff0c;在sql92规范中建议是&#xff1a;!&#xff0c;新的规范中建议为: <> 2、!NULL 与IS NOT NULL 比较 先说结论&#xff1a;默认情况下做比较条件时使用关键字“IS NULL”和“IS NOT NULL”&#xff1…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(上篇):制作更多地图,更多敌人,更多可交互对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、第一个代表性场景 1.制作敌人僵尸跳跳虫更多敌人2.制作敌人阿斯匹德更多可交互对象3.制作敌人孵化虫和它的孩子二、第二个代表性场景 1.制作更多敌人2.制作…...

Soap-UI传参

<?xml version"1.0" encoding"UTF-8"?> <soapenv:Envelope xmlns:soapenv"http://schemas.xmlsoap.org/soap/envelope/" xmlns:web"http://webservice.ihosp.jxmns.thirdparty.his.gocent.com/"><soapenv:Header/>…...

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考&#xff1a;https://segmentfault.com/q/1010000042181876 minio中国版&#xff1a;https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…...

递归算法之汉诺塔问题(Tower of Hanoi)详细解读

汉诺塔问题&#xff08;Tower of Hanoi&#xff09;是一个经典的递归问题&#xff0c;由法国数学家 douard Lucas 于1883年提出。问题描述了如何将不同大小的圆盘从一个柱子移到另一个柱子&#xff0c;同时遵循特定规则。它是计算机科学中用来展示递归思想和算法设计的经典案例…...

软件设计模式------工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;&#xff0c;又称工厂模式&#xff0c;也叫虚拟构造器模式&#xff08;Virtual Constructor Pattern&#xff09;或多态工厂模式&#xff08;Polymorphic Pactory Pattern&#xff09;,属于类创建型模式。 我们知道…...

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的&#xff1a;分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明&#xff1a;由于Gif录制工具帧率不够&#xff0c;渲染60帧用了4.6秒&#xff0c;平均帧率在12Hz左右&#xff0c;所以展示效果不好&#xff0c;想要看好些的效果可以看文章下面…...

git入门操作(2)

文章目录 git入门操作&#xff08;2&#xff09;git diff 查看差异git diff gitignore忽略文件1.在代码仓库创建这个文件2.添加对 log 文件过滤 连接远程仓库与ssh配置远程仓库和本地仓库关联步骤分支基本操作步骤命令&#xff1a; 合并冲突分支合并逻辑1.新建分支 dev&#xf…...

【AI学习】扩散模型学习总结PPT

#1024程序员节&#xff5c;征文# 看了一些文章&#xff0c;大概学习了扩散模型。 《李宏毅 2023 最新 Diffusion Model 原理讲解》&#xff08;文章链接&#xff1a;https://zhuanlan.zhihu.com/p/692430885&#xff09; 《What are Diffusion Models?》 https://lilianwen…...

【Python】相等性比较运算(==, is)的学习笔记

1. 相等性比较运算&#xff1a; & is Python中有两种比较运算符和is&#xff1b; 和 is 的主要区别在于它们比较的对象属性不同&#xff1a; 运算符&#xff1a; 比较对象的值或内容是否相等。调用对象的 __eq__() 方法来进行比较。可以被重载&#xff08;在自定义类中重…...

智慧公厕厂家:智慧公厕建设推动城市公厕智能化变革

随着科技的不断进步&#xff0c;智慧公厕厂家正以创新之力推动着城市公厕的智能化变革。 一、提升用户体验 智慧公厕为使用者带来了前所未有的便利。通过实时显示厕位使用情况&#xff0c;避免了旅客的无效排队&#xff0c;节省了时间。感应式设备如水龙头、洗手液等&#xff…...

大一计算机课程之线性代数

《大一计算机课程之线性代数》 在大一的计算机课程中&#xff0c;线性代数是一门极为重要的基础学科&#xff0c;它就像一把神奇的钥匙&#xff0c;为计算机科学领域的诸多方面开启了智慧之门。 线性代数主要研究线性方程组、向量空间、线性变换等内容。对于计算机专业的学生…...

什么是运动控制器?运动控制器的特点

运动控制器是一种专门用于控制机械系统中运动部件&#xff08;如电机、驱动器和其他运动元件&#xff09;的电子设备。它们在自动化、机器人、数控机床、工业自动化和精密控制系统等领域得到了广泛应用。 运动控制器的功能 运动控制器主要负责以下几个方面的功能&#xff1a;…...

[AWS]RDS数据库版本升级

背景&#xff1a;由于AWS上mysql5.7版本不再支持&#xff0c;需要进行版本升级。 吐槽&#xff1a;每年都要来那么几次&#xff0c;真的有病一样&#xff0c;很烦。 步骤一、升级检查 AWS提供了一个python的升级检测脚本&#xff0c;可以按照一下脚本下载测试&#xff1a; [r…...

(Golang)初识Go语言!!为什么选择Go?如何配置Go的开发环境?VS Code如何配置Go环境?

1. Go能做什么&#xff1f; go的优点&#xff1a;运行速度快、并发能力强 Go的应用领域&#xff1a; 区块链应用&#xff08;BT、分布式账本技术&#xff09; 后端服务应用 例如&#xff1a; 美团后台流量支撑程序 支撑主站的后台流量&#xff08;排序、推荐、搜索等&#xf…...

【人工智能-初级】第15章 TensorFlow 和 PyTorch 的入门:深度学习的利器

文章目录 一、引言二、TensorFlow 简介2.1 什么是 TensorFlow&#xff1f;2.2 TensorFlow 安装2.3 TensorFlow 构建简单的神经网络2.4 TensorBoard 可视化 三、PyTorch 简介3.1 什么是 PyTorch&#xff1f;3.2 PyTorch 安装3.3 PyTorch 构建简单的神经网络 四、TensorFlow 与 P…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...