![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CMake笔记
文章平均质量分 85
cmake的使用方法,由浅入深,边学边记。
温铜
国际逗比协会荣誉会长
展开
-
010.CMake函数和宏(下)
文章目录函数和宏的根本区别同名覆盖总结函数和宏的根本区别函数和宏之间的一个根本区别,是函数引入了一个新的变量作用域,而宏没有。在函数内定义或修改的变量对函数外同名的变量没有影响,而宏与其调用者共享相同的变量范围。但是请注意,函数不会引入新的策略作用域(cmake_policy)。如前文所述,CMake函数和宏不支持直接返回值,但有专门的命令实现这一目的。set()命令的PARENT_SCOPE关键字可用于修改调用者作用域中的变量,而不是函数中的局部变量。虽然这与从函数返回值不同,但它确实允许将一个值(原创 2021-06-11 06:34:39 · 257 阅读 · 1 评论 -
009.CMake函数和宏(上)
就像它们在其他编程语言中的角色一样,函数和宏是开发人员扩展CMake功能、封装重复任务的主要机制。它允许开发人员定义可重用的CMake代码块,这些代码块可以像常规的内置CMake命令一样调用。它们也是CMake自己模块系统的基石(后文再说)。原创 2021-06-10 06:40:24 · 362 阅读 · 0 评论 -
008.CMake子目录项目
文章目录add_subdirectory()命令相关变量作用域include()命令相关变量return()命令总结对于简单的项目,使用单个文件夹是可以的,但复杂项目往往要按照模块进行拆分,这就需要划分不同的子目录。CMake提供了两种机制来实现这一目标,一个是add_subdirectory()命令,一个是include()命令。这两个命令有很大的区别,一定要仔细区别。add_subdirectory()命令add_subdirectory()命令允许项目将另一个目录引入到生成树中。该目录必须有自己原创 2021-06-07 21:40:26 · 1359 阅读 · 0 评论 -
007.CMake流程控制
依据某些条件,执行某些步骤,是CMake项目的一个常见需求。例如,项目可能希望仅对特定编译器或为特定平台构建时使用某些编译器标志。CMake提供了条件和循环来进行流程控制,和很多编程语言是差不多的。...原创 2021-06-07 06:10:26 · 233 阅读 · 0 评论 -
006.CMake变量(下)
调试变量在前文的演示中,使用了message()命令,该命令可以将变量的内容输出,类似于C语言里的printf函数。其完整的命令形式为:message([mode] msg1 [msg2]...)msg可以给出多个,但会合并在一起当做一个字符串输出。需要注意的是mode参数,其可取的关键字如下所示:STATUS:一般的状态信息,前面通常以两个连字符开头。WARNING:警告信息,通常会以红色显示,不会中断处理。AUTHOR_WARNING:和WARNING相似,但只会在允许输出开发者警告信息时原创 2021-06-06 04:16:39 · 444 阅读 · 0 评论 -
005.CMake变量(上)
变量是CMake完成任务的基石,尽管这一基石正越来越多的被属性所取代,但直到现在位置,变量的作用是毋庸置疑的。实际上,在整个CMake的工作逻辑中,CMakeLists.txt文件描述的核心内容就是项目的状态。**以变量的形式将这种状态保存下来,是最直观的方式。**当然现在CMake采用了更加容易理解的面向对象的组织方式,以各种对象(构建目标、目录、文件等)和对象的属性将状态组织起来,这在后面的文章中会介绍。普通变量使用如下命令设置变量:set(varName value... [PARENT_SCO原创 2021-06-04 22:48:36 · 201 阅读 · 0 评论 -
004.CMake构建目标的小练习
前文说了如何使用add_executable()和add_library()命令定义对应的目标,本文建立一个玩具项目,进一步演示其用法。HelloWorld项目与hello.exe新建一个CMake目录,并在其中建立一个source目录,在其中新建一个main.cpp和CMakeLists.txt文件。其目录结构如下:main.cpp内容:#include <iostream>int main(int argc, char** argv){ std::cout <&l原创 2021-06-04 18:14:33 · 552 阅读 · 0 评论 -
003.CMake构建目标初步
构建目标是CMake中非常重要的一个概念,所谓的现代CMake,可以认为就是所有命令都是围绕着构建目标来打转的。前文使用的add_executable()命令,便是定义了一个可执行文件目标,除此外CMake还支持各种类型的库目标,比如静态库(Static)、动态库(shared)、模块库(modules)、框架库(frameworks),并且可以非常方便的描述这些目标之间的依赖关系,以决定后续的链接步骤。可执行文件目标前文已经提到,定义该类目标的命令如下:add_executable(targetN原创 2021-06-03 01:10:44 · 423 阅读 · 0 评论 -
002.CMakeLists.txt文件初步
所有的CMake项目都以一个名为CMakeLists.txt的文件开始,它应该放在源代码树的顶部。它定义了从源代码和目标到测试、打包和其他定制任务的所有构建内容。这种定义的能力,来自于CMake自己的语言。CMake语言有许多程序员熟悉的东西,比如变量、函数、宏、条件逻辑、循环、代码注释等等。这些概念和特性将在接下来的文章中介绍。下面内容是一个简单的CMakeLists.txt文件,只包含三行,用以生成一个基本的可执行文件。cmake_minimum_required(VERSION 3.12)pro原创 2021-05-31 08:23:15 · 117 阅读 · 2 评论 -
001.设置项目
一个CMake项目要从一个CMakelists.txt文件开始,该文件定义了应该构建什么、如何构建、要运行什么测试以及要创建什么包。该文件是整个项目独立于平台的描述,之后CMake将其转换为特定构建工具项目文件。需要注意的是,它只是一个普通的文本文件,可以使用任何文本编辑器编辑之。第一个需要了解的概念,便是目录。CMake项目往往要区分源码目录,构建目录。源码目录是工程源码所在的地方,版本控制重点关注此处,CMakelists.txt文件就位于其中。而构建过程中产生的对象则需要放置在构建目录中,包括可执原创 2021-05-31 07:26:27 · 260 阅读 · 0 评论 -
000.CMake概览
CMake涵盖了从建立项目、构建应用到打包发布的所有内容。它不仅涵盖了从开始到结束的过程,还支持不同的平台、工具和语言。了解CMake的整体逻辑对使用CMake很有帮助,简单来讲,在CMake看来,项目从开始到结束的过程看起来像这样:首先是一个通用的项目描述,生成特定于构建平台的项目文件,比如make,VS,Xcode等,这一阶段是CMake最出名的地方。CMake同时提供了CTest和CPack,分别用于管理后期的测试和打包阶段。从开始到结束的整个过程可以完全由CMake来驱动,测试和打包步骤可以原创 2021-05-31 06:34:25 · 98 阅读 · 0 评论