【CMake 入门与进阶(6)】 CMakeLists.txt 部分常用变量(附使用代码)

news2024/7/4 5:23:10

        变量也是 cmake 中的一个重头戏,cmake 提供了很多内置变量,每一个变量都有它自己的含义,通过这个链接地址cmake-variables(7) — CMake 3.5.2 Documentation可以查询到所有的内置变量及其相应的介绍,如下所示:

         在这一份文档中,对变量进行分类,分为:提供信息的变量、改变行为的变量、描述系统的变量、控制编译的变量等等,笔者也按照这个分类给大家介绍一些基本、常用的变量。

提供信息的变量

        顾名思义,这种变量可以提供某种信息,既然如此,那么我们通常只需要读取变量即可,而不需要对变量进行修改:

变量说明
PROJECT_SOURCE_DIR工程顶层目录,也就是顶层 CMakeLists.txt 源码所在目录
PROJECT_BINARY_DIR工程 BINARY_DIR , 也就是顶层 CMakeLists.txt 源码的 BINARY_DIR
CMAKE_SOURCE_DIR与 PROJECT_SOURCE_DIR 等价
CMAKE_BINARY_DIR与 PROJECT_BINARY_DIR 等价
CMAKE_CURRENT_SOURCE_DIR当前源码所在路径
CMAKE_CURRENT_BINARY_DIR当前源码的 BINARY_DIR
CMAKE_MAJOR_VERSIONcmake 的主版本号
CMAKE_MINOR_VERSIONcmake 的次版本号
CMAKE_VERSIONcmake 的版本号(主+次+修订)
PROJECT_VERSION_MAJOR工程的主版本号
PROJECT_VERSION_MINOR工程的次版本号
PROJECT_VERSION工程的版本号
CMAKE_PROJECT_NAME工程的名字
PROJECT_NAME工程名,与 CMAKE_PROJECT_NAME 等价

        PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR

        PROJECT_SOURCE_DIR 变量表示工程的顶级目录,也就是顶层 CMakeLists.txt 文件所在目录; PROJECT_BINARY_DIR 变量表示工程的BINARY_DIR ,也就是顶层 CMakeLists.txt 源码对应的 BINARY_DIR(输出文件目录)。 譬如工程目录结构如下所示:

├── build
├── CMakeLists.txt
└── main.c

        CMakeLists.txt 文件内容如下:

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO)

message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})

        CMakeLists.txt 中我们打印了 PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 变量,进入到 build 目录下,执行 cmake:

         从打印信息可知,PROJECT_SOURCE_DIR 指的就是工程的顶层 CMakeLists.txt 源码所在路径,而 PROJECT_BINARY_DIR 指的是我们执行 cmake 命令的所在目录,也是顶层 CMakeLists.txt 源码的 BINARY_DIR。

  • CMAKE_SOURCE_DIR 和 CMAKE_BINARY_DIR

        同上

  • CMAKE_CURRENT_SOURCE_DIR 和 CMAKE_CURRENT_BINARY_DIR        

        指的是当前源码的路径以及当前源码的 BINARY_DIR,通过示例来看看,譬如工程目录结构如下所示:

├── build
├── CMakeLists.txt
├── main.c
└── src
  └── CMakeLists.txt

        顶层 CMakeLists.txt 文件通过 add_subdirectory 加载子目录 src 下的 CMakeLists.txt,src 目录下 CMakeLists.txt 文件内容如下所示:

# src 下的 CMakeLists.txt
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})

        通过 message 将这些变量打印出来,对比看看,进入到 build 目录下,执行 cmake:

  • CMAKE_VERSION、CMAKE_MAJOR_VERSION 和 CMAKE_MINOR_VERSION

         记录 cmake 的版本号,如下

# CMakeLists.txt
message(${CMAKE_VERSION})
message(${CMAKE_MAJOR_VERSION})
message(${CMAKE_MINOR_VERSION})

        打印信息如下:

  •  PROJECT_VERSION、PROJECT_VERSION_MAJOR 和 PROJECT_VERSION_MINOR

        记录工程的版本号,其实可以给工程设置一个版本号,通过 project()命令进行设置,如下:

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0

# 打印
message(${PROJECT_VERSION})
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})

        打印信息如下:

  • CMAKE_PROJECT_NAME 和 PROJECT_NAME

        两者等价,记录工程的名字:

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0

# 打印工程名字
message(${CMAKE_PROJECT_NAME})
message(${PROJECT_NAME})

        打印信息如下: 

 改变行为的变量

         顾名思义,意味着这些变量可以改变某些行为,所以我们可以通过对这些变量进行设置以改变行为。

变量说明
BUILD_SHARED_LIBS控制 cmake 是否生成动态库
CMAKE_BUILD_TYPE指定工程的构建类型,release 或 debug
CMAKE_SYSROOT对应编译器的在--sysroot 选项
CMAKE_IGNORE_PATH设置被 find_xxx 命令忽略的目录列表
CMAKE_INCLUDE_PATH为find_file()和 find_path()命令指定搜索路径的目录列表
CMAKE_INCLUDE_DIRECTORIES_BEFORE用于控制 include_directories()命令的行为
CMAKE_LIBRARY_PATH指定 find_library()命令的搜索路径的目录列表
CMAKE_MODULE_PATH指定要由 include()或 find_package()命令加载的 CMake 模块的搜索路径的目录列表
CMAKE_PROGRAM_PATH指定 find_program()命令的搜索路径的目录列表
  • BUILD_SHARED_LIB

        对于 add_library()命令,当没有显式指定生成动态库时(SHARED 选项),默认生成的是静态库;其实 们可以通过 BUILD_SHARED_LIBS 变量来控制 add_library()命令的行为,当将变量设置为 on 时表示使能动态库,则 add_library()默认生成的便是动态库文件;当变量设置为 off 或未设置时,add_library()默认生成的便是静态库文件。测试如下:

        譬如工程目录结构如下所示:

├── build
├── CMakeLists.txt
├── hello
│ └── hello.c
└── world
  └── world.c

        顶层 CMakeLists.txt 文件如下所示:

# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0)

set(BUILD_SHARED_LIBS on)
add_library(hello hello/hello.c)
add_library(world world/world.c)

        进入到 build 目录下,执行 cmake、make 进行构建、编译,将会生成动态库文件 libhello.so、libworld.so。

  • CMAKE_BUILD_TYPE

        设置编译类型 Debug 或者 Release。debug 版会生成相关调试信息,可以使用 GDB 进行调试;release 不会生成调试信息:

# Debug 版本
set(CMAKE_BUILD_TYPE Debug)

# Release 版本
set(CMAKE_BUILD_TYPE Release)
  • CMAKE_SYSROOT

        cmake 会将该变量传递给编译器--sysroot 选项,通常在设置交叉编译时会使用到。

  • CMAKE_INCLUDE_PATH

        为 find_file()和 find_path()命令指定搜索路径的目录列表。它们分别用于查找文件、路径,我们需要传入一个文件名,find_file()命令会将该文件的全路径返回给我们;而 find_path() 命令则会将文件的所在目录返回给我们。

        这两个命令去哪找文件呢?也就是通过CMAKE_INCLUDE_PATH 变量来进行指定 , CMAKE_INCLUDE_PATH 指定了一个目录列表,find_file()、find_path()会去这个目录列表中查找文件。接下来我们进行测试。

        譬如工程目录结构如下所示:

├── build
├── CMakeLists.txt
└── src
  └── 1.c

        顶层 CMakeLists.txt 文件内容如下:

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0

find_file(P_VAR 1.c)
message(${P_VAR})

        通过 find_file 命令查找 1.c 文件,将路径信息记录在 P_VAR 变量中;现在我们没有设置 CMAKE_INCLUDE_PATH 变量,看看能不能找到 1.c 文件,cmake 打印信息如下:

         很明显提示没有找到,现在我们对 CMAKE_INCLUDE_PATH 变量进行设置,如下所示:

# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0

# 设置 CMAKE_INCLUDE_PATH 变量
set(CMAKE_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/src)

# 查找文件
find_file(P_VAR 1.c)
message(${P_VAR})

        此时打印信息为:

         这次就成功找到了 hello.c 文件,并将文件的全路径返回给我们。

  • CMAKE_LIBRARY_PATH

        指定 find_library()命令的搜索路径的目录列表。find_library()命令用于搜索库文件,find_library()将会从 CMAKE_LIBRARY_PATH 变量设置的目录列表中进行搜索。

  • CMAKE_MODULE_PATH

        指定要由 include()或 find_package()命令加载的 CMake 模块的搜索路径的目录列表。

  • CMAKE_INCLUDE_DIRECTORIES_BEFORE

        这个变量在前面给大家提到过,它可以改变 include_directories()命令的行为。include_directories()命令默认情况下会将目录添加到列表的后面,如果将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 on,则 include_directories()命令会将目录添加到列表前面;同理若将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 off 或未设置该变量,include_directories()会将目录添加到列表后面。

  • CMAKE_IGNORE_PATH

        被 find_program()、find_library()、find_file()和 find_path()命令忽略的目录列表。表示这些命令不会去 CMAKE_IGNORE_PATH 变量指定的目录列表中搜索。


未完待续......

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

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

相关文章

App移动端测试 —— Monkey的日志

Monkey的日志对于分析脚本的执行情况十分必要。 Monkey 日志由以下几部分组成: 测试命令信息:随机种子 seed、运行次数、可运行应用列表、各事件百分比。” 正文内容从这里开始(可直接省略,亦可配图说明)。 01—Mon…

使用python批量处理工作簿和工作表

案例01 批量新建并保存工作簿 将for语句与xlwings模块相结合,就可以轻松实现批量创建工作簿 import xlwings as xw # 导入xlwings模块 app xw.App(visibleTrue,add_bookFalse) # 启动Excel程序,但不新建工作簿 for i in range(6):workbook app.books…

Pyinstaller 快速找出所需库的方法

目录 【auto-py-to-exe】第三方库 使用【auto-py-to-exe】逐步尝试 1.什么文件都不添加,选择项目与单目录后直接打包 2.直接运行生成的exe文件 3.定位所需的包 4.--add-data 和 --hidden-import 打包为一个exe文件 【auto-py-to-exe】第三方库 其是pyinstaller操…

【头歌-Python】9.1 X射线衍射曲线绘制(project)第3~4关

第3关:X 射线衍射曲线峰值 任务描述 本关任务:读文件中的数据绘制线图形并加绘制峰值。 相关知识 为了完成本关任务,你需要掌握: python 读取文件中的数据使用 matplotlib 绘制图形 python 读取文件 python读取文件可以用以…

6.volatile与JMM

volatile与JMM 6.1 被volatile修饰的变量有两大特点 特点: 可见性 有序性:有排序要求,有时需要禁重排 内存语义: 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中 当读一个vol…

Linux:ftp服务 (vsftpd)

我的ftp服务器为centos7 使用yum安装的vsftpd软件 (如果你需要离线yum库,而不会搭建可以查看) Linux:rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 安装软件 配置环境 其次是Linux的防火墙和selinu…

写一个Orillusion编辑器(伪)

界面效果 思路 bootstrap控制界面效果jquery动态修改界面内容[Add]增加一个box[Play]导出play.html,打开play.html就可以看到程序运行效果 编辑器代码 <!DOCTYPE html> <html> <!-- TODO 1. 序列化数据,保存工程 2. 反序列化数据,打开工程 --><head>…

Python实现ACO蚁群优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

腾讯安全SOC+荣获“鑫智奖”,助力金融业数智化转型

近日&#xff0c;由金科创新社主办&#xff0c;全球金融专业人士协会支持的“2023鑫智奖第五届金融数据智能优秀解决方案评选”榜单正式发布。腾讯安全申报的“SOC基于新一代安全日志大数据平台架构的高级威胁安全治理解决方案”获评“鑫智奖网络信息安全创新优秀解决方案”。 …

大数据分析平台释疑专用帖

大数据分析平台是大数据时代&#xff0c;企业数字化运营决策的一大关键平台&#xff0c;但初次接触大数据分析平台时&#xff0c;大家必然是问题多多的&#xff0c;本文将就几个比较常见的问题进行总结回答&#xff0c;希望对正在了解、选型大数据分析平台的大家有所帮助。 首…

Qt学习08:文本输入类与快捷键

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 QLineEditQTextEditQTextCursor QPlainTextQKeySequenceEdit QLineEdit QLineEdit是最基本的输入控件&#xff0c;常用于短行的文本输入。 构造函数 QLineEdit(const QString &contents, QWidget *parent …

07_scrapy的应用——获取电影数据(通过excel保存静态页面scrapy爬虫数据的模板/通过数据库保存)

0、前言: 一般我们自己创建的一些python项目,我们都需要创建虚拟环境,其中会下载很多包,也叫做依赖。但是我们在给他人分享我们的项目时,不能把虚拟环境打包发送给别人,因为每个人电脑系统不同,我们可以把依赖导出为依赖清单,然后别人有了我们的依赖清单,就可以用一条…

[网络工程师]-网络规划与设计-网络测试运行和维护(二)

4、局域网测试 局域网测试主要是检验网络是否为应用系统提供了稳定、高效的网络平台,如果网络系统不够稳定,网络应用就不可能快速稳定。对于常规的以太网进行系统测试,主要包括系统连通性、链路传输速率、吞吐率、传输时延、丢包率及链路层健康状况测试等基本功能测试。 4.…

用那种方式安装 ThinkPHP 5.0?

简单介绍 ThinkPHP是一个免费开源的&#xff0c;快速、简单的面向对象的轻量级PHP开发框架&#xff0c;是为了敏捷WEB应用开发和简化企业应用开发而诞生的。 ThinkPHP5.0版本是一个颠覆和重构版本&#xff0c;采用全新的架构思想&#xff0c;引入了更多的PHP新特性&#xff0c…

分享几个免费 AI 生成工具 (第一期)

今天来给大家分享几个国外免费的AI视频生成工具 Artflow ai https://app.artflow.ai Artflow.ai 是一款人工智能工具&#xff0c;旨在帮助用户创建自定义头像并让他们的故事栩栩如生。主要特点和优势包括&#xff1a; 自定义创作&#xff1a;从文本中生成角色、场景和声音&…

利用C语言实现十大经典排序算法的方法

排序算法 算法分类 —— 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。 非比较类排序&#xff1a;不通过比较来决定元素间…

《实战AI低代码》:一场新的软件工程革命

目录 五十年前的软件危机 二十年前的软件危机 今天的软件危机 革命性的新技术 AI低代码开发宣言 AI低代码开发原则 一场新的软件工程革命 AI低代码开发不仅是继面向过程,面向对象之后的一种新的抽象方式,也是继瀑布开发,敏捷开发之后的一种新的开发方法。 五十年前的…

QT学习07:五种按钮控件

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 抽象类&#xff1a;QAbstractButtonQPushButtonQToolButtonQCommandLinkButtonQRadioButtonQCheckBoxQButtonGroup 抽象类&#xff1a;QAbstractButton 是所有按钮类的祖先。 QAbstractButton的信号&#xff1a…

【appium】appium自动化入门之API(中)

上一篇介绍了在appium上启动app和两个定位元素的小工具使用方法&#xff0c;这篇就从appium的一种小方法&#xff1a;远程控制&#xff0c;以及如何把appium上的输入法调整成中文&#xff0c;算是两个小技巧吧 目录 正文 2.4 Remote 远程控制 前言 2.4.1 设置 IP 2.4.2 访问地址…

OpenMMLab-AI实战营第二期-课程笔记-Class 3:RTMPose关键点检测

Class 3&#xff1a;RTMPose关键点检测 文章目录 Class 3&#xff1a;RTMPose关键点检测概述安装相关库为了方便使用者快速上手 MMPose&#xff0c;这次课程有着丰富的示例代码脚本&#xff0c;以及详细的技术文档&#xff0c;包括安装、数据集准备、使用教程、常见问题解答等。…