为什么要用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是把编译之后的文件拷贝到合适的文件夹之下。

 总结:总的来说,源码编译必经的三个阶段如下:

  1. 自动化工具(cmake,configure)构建Makefile;
  2. 所有项目的编译(make)
  3. 编译的结果的安装,即文件拷贝(install)
Linux上,C++的JSON库(例如nlohmann/json)通常作为头文件库(header-only library),这意味着它的所有功能都是包含在源代码中的,不需要编译成`.a`或`.so`这样的动态链接库。不过,如果你还是想把它转换为静态库以便于项目管理,你可以按照以下步骤进行: 1. **下载源码**: - 访问nlohmann/json的GitHub仓库:https://github.com/nlohmann/json - 将源代码克隆到本地或者从`include`目录复制到你的项目中。 2. **创建构建目录**: - 创建一个新的目录用于存放编译过程生成的中间文件,如`build`。 3. **配置**: - 使用CMake来管理编译过程。打开终端,进入刚刚创建的`build`目录,运行以下命令初始化CMakeLists.txt文件(假设你的源码在当前目录下): ``` cmake .. ``` 4. **编译**: - 如果CMake没有报错,运行`make`来编译库: ``` make ``` 这将会生成一个静态库文件,通常是`.a`格式(取决于你的平台,可能是libjson.a或libnlohmann_json.a)。 5. **安装**: - 如果你想让这个库全局可用,可以使用`install`目标,例如: ``` make install ``` 这将把库安装到系统指定的位置,如`/usr/local/lib`。 6. **链接**: - 在你的项目中,添加静态库到链接器参数中。例如,在`CMakeLists.txt`中添加 `-L/path/to/build -lnlohmann_json`(替换为实际路径)。 请注意,nlohmann/json库已经提供了方便的预定义宏`NLOHMANN_JSON_NO_EXPLICIT_CONSTRUCTORS`,这使得它更适合做为头文件库。如果确实需要将其编译为库,上述步骤可能会变得复杂,因为其设计并不支持这种操作。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值