当前位置: 首页 > 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…...

不只是优化和频率:用GaussView 5.0玩转HOMO/LUMO、电子密度与反应位点预测

不只是优化和频率&#xff1a;用GaussView 5.0玩转HOMO/LUMO、电子密度与反应位点预测 在计算化学领域&#xff0c;Gaussian和GaussView的组合堪称黄金搭档。但许多研究者往往止步于基础的几何优化和频率计算&#xff0c;未能充分挖掘这套工具在反应机理研究和论文写作中的潜力…...

【Nanobot】README09_LEVEL4 添加新聊天渠道

【Nanobot】README09_LEVEL4 添加新聊天渠道 源码地址&#xff1a;https://github.com/HKUDS/nanobot &#x1f3af; 目标 指导如何为 nanobot 添加新的聊天渠道&#xff08;如 Signal、Matrix、Line 等&#xff09;。 &#x1f4cb; 添加新 Channel 的步骤 步骤 1&#xff1…...

如何让Windows资源管理器完美预览iPhone照片:HEIC缩略图插件全解析

如何让Windows资源管理器完美预览iPhone照片&#xff1a;HEIC缩略图插件全解析 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你…...

TalkingHeads开源项目:基于扩散模型的AI人脸说话视频生成技术详解

1. 项目概述&#xff1a;当AI学会“眉目传情” 最近在折腾一个挺有意思的开源项目&#xff0c;叫TalkingHeads。简单来说&#xff0c;它能让一张静态的人脸照片“活”过来&#xff0c;不仅能根据你输入的音频或文本生成口型同步的说话视频&#xff0c;还能让视频里的人做出各种…...

代码编辑器世纪大战:VS Code vs JetBrains IDE vs Zed全面对比

Visual Studio Code、IntelliJ IDEA/PhpStorm/WebStorm、Zed——这三种编辑器代表了三代程序员的生产力哲学。本文从响应速度、生态成熟度、AI赋能、协作能力四个维度进行深度横评。 一、三种编辑器的基因差异 VS Code&#xff1a;开放生态的胜利 VS Code的核心优势不是功能&am…...

数字图像处理入门:像素、通道与卷积操作的核心原理与实践

1. 项目概述&#xff1a;为什么“基本知识”是数字图像处理的基石刚入行做图像处理那会儿&#xff0c;我犯过一个典型的“新手错误”&#xff1a;拿到一张图&#xff0c;二话不说就开始调OpenCV的函数&#xff0c;什么高斯模糊、边缘检测、二值化&#xff0c;一顿操作猛如虎&am…...

ISO 11452-4 BCI测试补偿系数:从核心原理到工程校准的完整指南

1. 项目概述&#xff1a;从一次“诡异”的测试失败说起几年前&#xff0c;我接手了一个车载ECU的电磁兼容性摸底测试项目。按照标准流程&#xff0c;我们需要在电波暗室里&#xff0c;对样件进行ISO 11452-4标准规定的BCI&#xff08;大电流注入&#xff09;测试。测试计划、设…...

Bash脚本自动化部署ROS机械臂环境:OpenClaw一键安装实践

1. 项目概述&#xff1a;一个为中文用户定制的自动化安装脚本如果你在GitHub上搜索过与机械臂、机器人操作系统&#xff08;ROS&#xff09;或类似开源硬件项目相关的资源&#xff0c;大概率会看到过“OpenClaw”这个名字。它是一个开源的、模块化的机械爪项目&#xff0c;设计…...

2025最权威的AI辅助写作助手推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI辅助写作工具正深刻改变着学术研究的传统范式&#xff0c;这是随着人工智能技术飞快发展而…...

终极指南:如何永久冻结IDM试用期实现终身免费使用

终极指南&#xff1a;如何永久冻结IDM试用期实现终身免费使用 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 你是否曾经为IDM&#xff08;Internet Download Ma…...