初衷

CMake能用来编写跨平台(cross-platform)的构建规则,通过这些规则来调用各个平台的编译器、链接器,生成各个目标(静态库,静态库,或者可执行)。

我第一个接触的大型C++项目是OpenCV,它是基于CMake构建的。后来接触的另一个大型C++项目是Caffe,既提供Makefile也提供CMakeLists.txt。在使用CMake的过程中对CMake的常用语法越发熟悉,甚至日常工作中的项目代码也被我用CMake进行构建。但是仍然觉得对CMake不够了解,CMake的不少用法在官方文档中的描述也感觉有些晦涩、不清晰。

好在CMake是开源项目,觉得CMake文档写的烂那就直接翻源码。而由于越来越多的C/C++开源项目使用CMake进行构建,学习和深入理解CMake对于一个C/C++(尤其是跨平台)程序员来说还是有相当的好处和必要的。(当然你也可以用gradle/bazel/buck/please/scons/xmake/emake等来构建)

此外,我也仔细看过CMake官方文档的部分章节,写过几篇蹩脚的CMake笔记文档,了解到通常越新版本的CMake特性越多。这系列blog分析的CMake源码是CMake-3.14.3版。(不得不吐槽一下:CMake官网打开速度太慢,国内各大开源镜像站点也都不收录CMake源码,CMake官方文档打开也超慢,而且写的也不够系统,中文博客讲CMake的也往往很初级)。如果你是第一次接触CMake,我觉得你最好先用用CMake,稍微熟悉一点基本用法和一些概念后再来看本篇不迟。

CMake入口:命令行参数

CMake是什么?或许我们应该从"cmake.exe是什么?"(windows),或file `which cmake`(Linux或Mac)来分析。当我们安装好CMake,它提供了一个可执行文件cmake或cmake.exe,有时候还提供一个GUI版本,比如ccmake或cmake-gui,不过GUI版本可以认为是外科,里子还是cmake命令。

那么cmake命令是什么?其实就是一个C/C++项目编译出来的可执行文件。它或许提供了一大堆支持的函数、类,但是对外的接口可以说只有一个,那就是main()函数。当我敲下cmake ..或者cmake .. -DCMAKE_BUILD_TYPE=Debug,再或者cmake --build .,cmake到底会怎么执行,其实就是看它的commandline argument parser是怎么处理的了:它能接受的(合法的)命令行参数有哪些?每一种分别是什么含义?

image.png

从$CMAKE_ROOT/Source/cmakemain.cxx可以看出,它肯定支持的三个参数是:

--build

--open

-E

继续看,发现do_cmake()函数中处理了其他参数的情况,而且数量非常多:

image.png

而我们看看官方文档对cmake命令行支持的参数是怎么写的,先看cmake3.13版本的文档,可以说是稀巴烂:

image.png

再看cmake3.14版本的命令行参数文档:

image.png

看起来有所改善,把支持的命令行参数分成了几个类别,思路上清晰了不少;不过仍然需要改进,比如说cmake -N这一条没有被列出,但是其实后文又有提到。

根据3.14版的文档可以看出,执行cmake命令,支持7大类参数:

指定CMakeLists.txt所在路径,用来生成目标平台的构建文件如Makefile、.sln、.xcodeproject等(cmake的主要特色)

执行构建,相当于用通用的写法,对生成的目标平台构建描述文件进行调用,替代具体的"make"、"nmake"等写法。(个人经常用,还可以指定--target TargetName和--config BUILD_TYPE)

用VS、XCode等打开工程(我没用过,我也觉得没必要)

执行cmake脚本

执行命令行工具

执行find-package工具(其实很废柴,和CMakeLists.txt中的find_package()根本不是一会事儿,试了好几个包都找不到)

在命令行里查看帮助(已经是9012年了,多少年前就有git help xxx --web在网页中看帮助文档了,cmake什么时候支持一下?)

linux下cmake命令行,深入理解CMake(1): CMake命令行参数相关推荐

  1. linux下wps 点击无反应 无法打开 在命令行也打不开,最开始可以打开,关机重启之后不能够打开

    linux下wps 点击无反应 无法打开 在命令行也打不开,安装之后可以打开,关机重启之后打不开了 解决方案: 删除~/.config/Kingsoft文件 然后重启,一切正常 转载自https:// ...

  2. Linux下实用的查看内存和多核CPU状态命令

    Linux下实用的查看内存和多核CPU状态命令 ]作者:zale0_0 来源:博客园 发布时间:2012-02-08 14:49 阅读:12 次 原文链接 [收藏] 查看多核CPU命令 mpstat ...

  3. C++笔记之linux下非阻塞多线程运行多个系统shell命令(popen方法)

    参考博文:C++ linux 睡眠函数sleep和std::this_thread::sleep_for 参考博文:C++笔记之linux下运行系统shell命令(popen方法)函数封装 参考博文: ...

  4. Linux下查看DNS服务器IP地址以及使用host命令查询域名对应的IP地址

    Linux下查看DNS服务器IP地址以及使用host命令查询域名对应的IP地址 Linux使用etc/resolv.conf文件来存放DNS服务器的IP地址,使用cat命令查看. cat /etc/r ...

  5. linux系统怎么查看raid卡信息,LINUX下查SCSI卡、RAID卡信息的命令

    Linux下查SCSI卡.RAID卡信息的命令 shell#cat /proc/scsi/scsi shell#/sbin/lspci shell#/usr/sbin/dmidecode 例: [ro ...

  6. Linux下查看某个进程打开的文件数-losf工具常用参数介绍

    Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...

  7. linux下system函数的深入理解

    这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...

  8. Linux下C/C++实现以十六进制的形式显示命令(xxd)

    如果你需要在linux文本文件的十六进制转储?且正在寻找可以执行此操作的命令行实用程序,xxd的命令可以为你做这件事.xxd命令将文件显示为十六进制值和ASCII表示,并允许对其进行编辑. xxd - ...

  9. linux下怎么进入mysql界面_linux界面进入mysql命令

    linux下通过命令我们可以直接连接mysql进入mysql命令行模式.下面由学习啦小编为大家整理了linux下进入mysql命令的相关知识,希望对大家有所帮助! linux下进入mysql命令 连接 ...

  10. linux下查看进程占用端口和端口占用进程命令

    Linux下查看进程占用端口: 查看程序对应进程号:ps –ef|grep 进程名 REDHAT :查看进程号所占用的端口号:netstat –nltp|grep 进程号 ubuntu:查看进程占用端 ...

最新文章

  1. JGG:口腔微生物组助力妊娠糖尿病识别
  2. Cocos2d-x 3.2 Lua演示样例FontTest(字体測试)
  3. 来阿里前 vs 来阿里后
  4. linux安装mysql不成功怎么处理_Linux上安装MySQL时出现不兼容的解决办法
  5. 男人“杀”死女人的30句话
  6. 漫步微积分十五——凹凸性和拐点
  7. 星低级格式化工具_Elixir 数据库查询工具 Ecto 讲解
  8. php根据ip获取地区的程序代码
  9. 【分类汇总】110 天以来的题解分类汇总
  10. Java之父:Solaris前景堪忧
  11. 项目经理要具备的三种能力
  12. java发包工具_小米范工具系列之四:小米范HTTP批量发包器
  13. 【快进来,这不是毒鸡汤,只是有毒而已】
  14. 【splishsplash】修复catch.hpp的问题
  15. 2022.8.17 mysql 课后作业
  16. Scaling Apps with Varnish
  17. 小程序-同步微信运动的步数
  18. 用一维字符数组方法输出下面的图形
  19. PHP错题本功能实现,收藏| 最高效的"错题本"制作攻略!手把手教会你!
  20. 一款适合小白的jmeter入门文档,性能测试工具-jmeter使用教程

热门文章

  1. linux raid auto 软raid parted,linux下的raid5配置方法.doc
  2. 神经网络训练集与Fock矩阵
  3. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第8章-有输入时滞的二阶多智能体系统的多一致
  4. Python对函数求偏导数
  5. java各种包的用途
  6. 净水器选购指南,如何挑选家用净水器
  7. 【PC工具】chrome浏览器插件vimium:传说上网可以不用鼠标。VIM入门工具,妈妈再也不用担心我学不会vim了...
  8. 【光通信】用于可见光通信的OFDM发射机和接收机
  9. 【频谱分配】基于频谱空洞预留算法的频谱分配算法的matlab仿真
  10. 码长6075的qc-ldpc编译码的MATLAB误码率仿真