MIUMIUBLING

导航

为什么要用make?为什么要用cmake?Linux源码编译的一般流程?

为什么要用make?为什么要用cmake?Linux源码编译的一般流程?


前言:对于C/C++以及Linux用户来说,编译器,make,cmake这几个工具是天天要接触到的,那到底为什么要使用呢?本文做一个小小的总结。

一、编译器gcc与g++
gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,为什么呢?
因为各个文件之间还涉及到互相访问与链接,错综复杂的关系一个一个处理很麻烦,很容易出错,素衣需要一个工具来制定一个很好的编译规则,这就是make的作用了
二、make工具

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

2.1 makefile是什么?

简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。实际上makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

2.2 make的缺点

(1)各种各样的make工具

你或许听过好几种 Make 工具,

例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。
这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
(2)makefile的编写太麻烦

makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

三、Cmake
CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。

可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。

 

四、一般的使用流程如下
在linux平台使用CMake生成Makefile并编译的一般流程如下:

(1)编写CMake配置文件CMakeLists.txt;
(2)执行 cmake PATH 或者 ccmake PATH 生成Makefile。PATH是CMakeLists.txt所在目录, cmake 与 ccmake 的区别在于后者提供了一个交互界面;它会自动搜索指定路径PATH中的CMakelists.txt文件,进行操作,
(3)执行 make -C PATH 命令进行编译。 -C 表示到指定目录下执行make, PATH 为Makefile文件所在目录。在Makefile文件所在目录执行make命令,可以不需要带任何参数,直接执行 make 命令进行编译。

五、Linux源码编译的一般流程
经常使用Linux源码编译的人应该习惯使用两套流程

(1)流程一:./configure+make+make install
(2)流程二:cmake+make+make install
现在集中回答几个问题

5.1 ./configure和cmake有什么异同点

相同点:

(1)都是为了生成编译规则Makefile文件
(2)他们都是为了更加方便的开发部署程序的自动化工具autotools,automake和autoconf是非常有用的用来发布C程序的东西。autotools包含了一系列的工具,如aclocal 、autoscan 、autoconf 、autoheader、 automake等
不同点:

(1)./configure就是执行你当前目录下一个名叫configure的脚本,Configure是一个脚本配置工具,该文件里面包含了很多的脚本命令。
(2)cmake的目的也是一样的,但是它所依据的是cmakelists.txt文件来生成Makefile文件

5.2 make和make install又有什么区别

make的作用是编译,make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件。但是编译出来的库文件和可执行文件是分别放着的,还不像一个完整的程序包,没有组织起来,
make install是把这些编译出来的可执行文件和库文件复制到合适的地方。像一个真正安装的程序包一样。它的主要作用就是“文件拷贝”。它所依据的是内容也是来自Makefile文件里面的内容。
实际上make和make install是两个基本的过程,我们在使用ming-win64编译OpenCV的时候就使用了这两个步骤,在使用mingw32-make编译完成之后,然后还要再使用mingw32-make install,将编译好的可执行文件,库文件拷贝到install文件夹之下的对应的文件夹里面去。

mingw32-make 编译代码,
mingw32-make install 文件拷贝
实际上使用window上面的VS编译OpenCV也是同样的道理,只不过它是通过ALL_BUILD和INSTALL来完成的。

首先编译ALL_INSTALL。ALL_BUILD相当于makefile里面的默认目标,构建整个项目,但不包括install和单元测试什么的。会将所有的代码进行编译,但是编译的库文件和可执行文件还没有组织好;
然后编译INSTALL。INSTALL是把编译之后的文件拷贝到合适的文件夹之下。
总结:总的来说,源码编译必经的三个阶段如下:

自动化工具(cmake,configure)构建Makefile;
所有项目的编译(make)
编译的结果的安装,即文件拷贝(install)

原文链接:https://blog.csdn.net/qq_27825451/article/details/103392719

posted on 2022-08-09 15:14  MIUMIUBLING  阅读(478)  评论(0编辑  收藏  举报