一、CMake和Makefile入门大全
CMake简介
CMake是一个跨平台的安装编译(Build)工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
只是 CMake 的组态档取名为CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建构方式使用。 这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
CMake主要特点
1、开放源代码,使用类 BSD 许可发布。下载CMake
2、跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
3、能够管理大型项目,KDE4 就是最好的证明。
4、简化编译构建过程和编译过程,Cmake 的工具链非常简单:cmake+make。
5、高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 libtool。
6、具备可扩展性,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
1、编写 CMake 配置文件 CMakeLists.txt 。
2、执行命令 cmake PATH 或者 ccmake PATH 生成Makefile。
3、其中, PATH 是 CMakeLists.txt 所在的目录。 使用 make 命令进行编译。
为什么使用CMake?
假如我们有一个深度学习框架的部分工程列表,里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系,在没有原作者的帮助下进行这项工作几乎是不可能的。
即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,因此CMake的作用就凸显出来了。原作者只需要生成一份CMakeLists.txt文档,框架的使用者们只需要在下载源码的同时下载作者提供的CMakeLists.txt,就可以利用CMake,在”原作者的帮助下“进行工程的搭建。
makefile简述
或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,
因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”, 一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
为什么使用makefile?
对于一个大型软件,其编译、维护是一个复杂而耗时的过程。它涉及到大量的文件、目录,这些文件可能是在不同的时间、由不同的人、在不同的地方分别写的,其中一些是程序,有些是数据,有些是文档,有些是衍生文件。甚至参与开发的人员也不一定清楚所有文件的细节,包括如何处理它们。此外,构成软件的文件数目可能达到成百上千,甚至成千上万个,开发过程中当修改了少量几个文件后,往往只需要重新编译、生成少数几个文件。有效地描述这些文件之间的依赖关系以及处理命令,当个别文件改动后仅执行必要的处理,而不必重复整个编译过程,可以大大提高软件开发的效率。
CMake和makefile逻辑
cmke使用案列
makefile经典教程
Cmake是用来makefile的一个工具:读入所有源文件之后,自动生成makefile。
二、案例实战
Centos7 环境中安装cmake3
1、卸载老版本、下载、解压、安装、版本检查、变更环境 (一气呵成)
[root@/usr/local/src/]# yum -y remove cmake #卸载老版本,因为之前提示最少3.1.3版本
[root@/usr/local/src/]# wget https://cmake.org/files/v3.7/cmake-3.7.2.tar.gz #下载网页源码包
[root@/usr/local/src/]# tar xf cmake-3.7.2.tar.gz #解压
[root@/usr/local/src/]#cd cmake-3.7.2 #切换该路径
[root@/usr/local/src/]#./bootstrap #安装cmake3.7.2
[root@/usr/local/src/]# gmake
[root@/usr/local/src/]# gmake install
[root@/usr/local/src/]# ln -s /usr/local/src/cmake3.7.2 /usr/bin/ #创建软链接
[root@/usr/local/src/]# cmake --version #版本检查
cmake version 3.7.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Ubuntu14.04(通用)安装CMake3
提示:需要安装前必须安装g++,安装之后操作
[root@/usr/local/src/]# apt-get remove cmake #卸载老版本,因为之前提示最少3.1.3版本
[root@/usr/local/src/]# wget https://cmake.org/files/v3.7/cmake-3.7.2.tar.gz #下载网页源码包(可自行选择版本)
[root@/usr/local/src/]# tar xf cmake-3.7.2.tar.gz #解压
[root@/usr/local/src/]#cd cmake-3.7.2 #切换该路径
[root@/usr/local/src/]#sudo ./bootstrap #安装cmake3.7.2
[root@/usr/local/src/]# sudo make
[root@/usr/local/src/]# sudo make install
[root@/usr/local/src/]# ln -s /usr/local/src/cmake3.7.2 /usr/bin/ #创建软链接
[root@/usr/local/src/]# cmake --version #版本检查
cmake version 3.7.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
其他
如果你想要通过CMake安装OpenCV+OpenCV_Contrib
那么,这里安装的CMake有所不同,得需要让CMake支持HTTPS,这样后续make的时候才不会报一些奇葩的错误。
tar -xf cmake-3.14.4.tar.gz
cd cmake-3.14.4
sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install zlib1g-dev
./bootstrap --system-curl
sudo make && sudo make install
To strive, to seek, to find, and not to yield. 去奋斗,去追求,去发现,不屈服。
本篇完_