cmake使用初览

写在前面

由于软件开发越来越工程化巨量化,不同于单文件的简单编译链接生成可执行文件,工程软件所涉及的依赖越来越复杂及文件数量越来越大,其编译链接过程十分复杂,因此掌握一套软件工程编译工具是很有必要的,并且对于复杂软件工程的开发及研究也是很有裨益。

CMake就是一款用于软件工程编译的工具。因为实际应用的程序大多数都是使用这个工具作为高层次工具,因此熟练掌握及应用这个工具对于之后的学习和工作有挺多的便利。本文基于自己对于CMake的认识和学习进行的简单总结,为了方便自己之后查看以及同样初学的同学参考。

目录

  • 一. CMake基本认识
  • 二. CMake基本使用步骤
  • 三. CMakeLists基本概念

一. CMake基本认识

CMake这个工具是为了方便使用make编译构建工具而诞生的。因为make工具本身是较为底层的编译构建工具,对于大型软件工程如果我们自己来编写makefile这个难度较大而且可能也容易出错,而CMake就是基于make的高层次编译构建工具。

make工具类似,CMake工具也需要编写构建文件,默认名为CMakeLists.txtCMake工具利用编写好的编译构建文件CMakeLists.txt,生成makefile,之后再利用make工具完成实际的编译构建过程。因此我们可以看出CMake就是用于生成规范化的makefile的工具,实际上的编译构建工作还是由make实现,只不过CMake将编译构建过程进行了更高层次地抽象,更容易让人理解,减少了很多自己编写makefile文件可能存在的麻烦和可能出现的问题。除此之外,CMake还能方便地让人控制编译过程,可以提高软件工程编译构建的灵活性。

二. CMake基本使用步骤

CMake工具的基本使用离不开可执行程序cmake和编译构建文件CMakeLists.txt的配合。一个基本的使用CMake工具进行编译的软件工程的简单用法如下。

软件工程结构如下:

project
|--build
│--CMakeLists.txt
│--source.cpp
  • build:表示CMake生成的cache文件目录以及后续编译构建生成文件的保存目录。
  • CMakeLists.txt:CMake编译构建文件。

对于形式如上的工程,整个编译构建过程如下:

  1. 切换当前目录至build文件目录下
  2. 运行命令行:
cmake ..

这句话的意思表示指定CMakeLists.txt所在的目录,并且在build目录下生成cmake cache相关文件。同时Makefile也在build目录下生成完毕

  1. 运行命令行:
make

使用make工具完成编译构建过程。

三. CMakeLists基本概念

我们知道cmake需要结合编译文件CMakeLists.txt进行使用,并且CMakeLists.txt的编写更为重要。因此对CMakeLists.txt的使用和编写方法进行学习和掌握至关重要。在我学习的经验中,CMakeLists.txt文件中的内容可以总结为两点,一是控制编译的流程,二是提供编译构建过程中所需的命令。

1. 编译流程的控制

编译构建软件工程的工具一大作用就是为了程序化软件化控制编译的流程。因此cmake提供了大量相关的概念,如默认变量CMAKE_PREFIX_PATH以及自定义变量等等。其中默认变量提供了很多信息,不同的变量有着不一样的作用,有的表示路径等信息,有的是用于编译时提供编译参数等等,这一部分很繁杂而且需要根据实际的使用自己去确定,可以参考官方文档有个总体概念:https://cmake.org/cmake/help/v2.8.7/cmake.html#section_Variables 。除了默认的变量,cmake也支持自己定义变量来提供更多的信息,同时再结合CMakeListst的控制语句,因此可以根据需求抽象化整个编译流程。

2. 编译构建过程中所需的命令

编译构建工具更为重要的作用当然就是构建工程。而软件工程的构建就少不了解决软件依赖的问题,即寻找构建目标所依赖的各种库。cmake一般是用于构建C/C++工程。而C/C++工程的构建大致分为三部分,编译动态链接库或静态链接库,编译可执行程序部分,将可执行程序与动态链接库或静态链接库链接。因此cmake提供了大量的命令用于这三部分。

  • 在编译动态链接库或静态链接库部分,cmake提供了add_library的命令。
  • 在编译可执行程序部分,cmake提供了add_executable命令。在前面这两个部分中,又涉及到指定头文件路径以及库文件路径的需求,因此,cmake提供了include_directorieslink_directories命令。
  • 在将可执行程序与动态链接库或静态链接库链接的部分,因为涉及到依赖库的寻找,cmake提供了find_package,include等命令,除此之外也支持通过自定义变量的方法人为设定依赖库的路径。在该部分中,将库与可执行程序进行链接,cmake则提供了target_link_libraries命令。
  • 在这三部分中,因为还涉及到文件的搜索和处理,cmake也提供文件及字符串相关的命令。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容