为什么要用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 阅读(490) 评论(0) 编辑 收藏 举报