Linux

Centos7 cmake 版本升级(由 v2.8.12.2 升级至 v3.26.4)

1.CMake定义


CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。

CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

CMake 不仅可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。

“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。

2.CMake应用场景


假如我们有一个深度学习框架的部分工程列表,里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系,在没有原作者的帮助下进行这项工作几乎是不可能的。

即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,因此CMake的作用就凸显出来了。原作者只需要生成一份CMakeLists.txt文档,框架的使用者们只需要在下载源码的同时下载作者提供的CMakeLists.txt,就可以利用CMake,在”原作者的帮助下“进行工程的搭建。

打个更通俗易懂的比喻,小利在路边捡瓶盖赚了500万准备买房,但是小利这一麻袋的5毛、一块、十块、五十、一百售楼处的小姐姐嫌麻烦不想收这些钱,那怎么办呢?小姐姐建议小利把钱拿到银行去换成一张银行卡,然后直接来刷卡就行啦!CMake这里就扮演银行的角色,帮你去整理你的资产。

3.CMake主要功能


  • 配置和生成各大平台的工程(VS的vcxproj,Qt的Pro):

比如设置输出目录,设置编译对象的debug后缀,设置源码在工程中的那个文件夹(Filter),配置需要依赖的第三方的头文件目录,库目录等等属性。

  • 生成makefile文件

计算机编译源文件的时候是一条指令一条指令的发送给编译器执行的,这样效率很低下,所以就产生了一种文件,把所有的命令写到一个文件中,这个文件就是makefile。CMake生成了这个makefile之后,各大平台的编译器都会拿到这个makefile然后解析它。将他的命令解析出来一条一条执行。

4.makefile介绍


  • 什么是makefile?

或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

使用 GCC 的命令行进行程序编译在单个文件下是比较方便的,当工程中的文件逐渐增多,甚至变得十分庞大的时候,使用 GCC 命令编译就会变得力不从心。这种情况下我们需要借助项目构造工具 make 帮助我们完成这个艰巨的任务。 make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Visual C++ 的 nmake,QtCreator 的 qmake 等。

make 工具在构造项目的时候需要加载一个叫做 makefile 的文件,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

makefile 带来的好处就是 ——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。

makefile 文件有两种命名方式 makefile 和 Makefile,(注意:makefile文件就叫这个名字,是前面这两种文件名,并且没有扩展名或者后缀),构建项目的时候在哪个目录下执行构建命令 make 这个目录下的 makefile 文件就会别加载,因此在一个项目中可以有多个 makefile 文件,分别位于不同的项目目录中。

  • 为什么要用makefile?

对于一个大型软件,其编译、维护是一个复杂而耗时的过程。它涉及到大量的文件、目录,这些文件可能是在不同的时间、由不同的人、在不同的地方分别写的,其中一些是程序,有些是数据,有些是文档,有些是衍生文件。

甚至参与开发的人员也不一定清楚所有文件的细节,包括如何处理它们。此外,构成软件的文件数目可能达到成百上千,甚至成千上万个,开发过程中当修改了少量几个文件后,往往只需要重新编译、生成少数几个文件。有效地描述这些文件之间的依赖关系以及处理命令,当个别文件改动后仅执行必要的处理,而不必重复整个编译过程,可以大大提高软件开发的效率。

5.CMakeLists.txt介绍


CMakelists.txt是Cmake的配置文件,用于描述编译方式和项目依赖。CMakeLists.txt文件是CMake编译系统编译软件包过程的输入文件,任何CMake兼容包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何编译代码以及将其安装到哪里。在windows下CMake 会读取 CMakeLists.txt 中的设置,并生成项目的 makefile 或 Visual Studio 工程文件。

makefile文件的编写实在是个繁琐的事,于是,CMake出现了,使得这一切变得简单,CMake通过CMakeLists.txt读入所有源文件自动生成makefile,进而将源文件编译成可执行文件或库文件。

6.总结


Cmake是用来makefile的一个工具,读入所有源文件之后,自动生成makefile。

7.centos 升级 cmake 方法


在centos7 yum源中和系统自带的cmake版本为2.8.12.2;在编译某些文件的时候会提醒cmake版本过低,本文旨在解决cmake的更新问题

cmake官网:https://cmake.org/
cmake下载:https://cmake.org/files/

1. 查看当前cmake版本

[root@localhost ~]# cmake -version
cmake version 2.8.12.2

2. 进行卸载

[root@localhost ~]# yum remove -y cmake

3. 进行安装包的下载,也可以下载好安装包后传至相应的目录

[root@localhost ~]# mkdir /opt/cmake
[root@localhost ~]# cd /opt/cmake/

4. 下载或拷贝,解压

[root@localhost cmake]# wget https://cmake.org/files/v3.26/cmake-3.26.4.tar.gz
[root@localhost cmake]# tar -zxvf cmake-3.26.4.tar.gz

5. 安装编译工具

[root@localhost cmake]# yum install -y gcc gcc-c++  

6. 进行编译连接

[root@localhost cmake]# ./configure --prefix=/usr/local/cmake

7. 安装

[root@localhost cmake]# cd cmake-3.26.4
[root@localhost cmake-3.26.4]# make && make install 

8. 创建链接

[root@localhost cmake-3.16.6]# ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake 

9. 查看版本

[root@localhost cmake-3.26.4]# cmake -version
cmake version 3.26.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).

10、如果第9步不想创建链接的话,也可以修改环境变量

[root@localhost ~]# vim /etc/profile
...
export CMAKE_HOME=/usr/local/cmake
export PATH=$PATH:$CMAKE_HOME/bin
## 刷新配置
[root@localhost ~]# source /etc/profile
Centos7 升级 cmake v3.26.4 操作完毕!