CMake 与 Make

1. 前面的话

程序员已经使用 CMake 和 Make 很长时间了。当您加入一家大公司或开始从事具有大型代码库的项目时,您需要处理所有这些构建。

您一定已经看到了那些“CMakeLists.txt”文件。您应该在终端上运行“cmake”和“make”命令。很多人只是盲目地遵循指示,并不真正关心我们为什么需要以某种方式做事。

整个构建过程是什么?为什么要这样构建?CMake 和 Make 有什么区别?有关系吗?它们可以互换吗?  

事实证明,它们完全不同。重要的是要了解它们之间的差异,以确保您不会陷入困境。在讨论差异之前,让我们先看看它们是什么。

2. Make

我们设计软件系统的方式是首先编写代码,然后编译器编译它并创建可执行文件。这些可执行文件是执行实际任务的文件。“Make”是一种控制从程序的源文件生成程序的可执行文件和其他非源文件的工具。

“Make”工具需要知道如何构建你的程序。它从名为“makefile”的文件中获取有关如何构建程序的知识。这个 makefile 列出了每个非源文件以及如何从其他文件计算它。当你编写一个程序时,你应该为它编写一个makefile,这样就可以使用“Make”来构建和安装程序。简单的东西!如果您不理解它,请返回并再次阅读该段落,因为它对下一部分很重要。

3. 为什么我们需要“make”?

我们需要“Make”的原因是因为它使最终用户能够构建和安装你的包,而无需知道它是如何完成的细节。每个项目都有自己的规则和细微差别,每次你有一个新的合作者时都会很痛苦。这就是我们有这个makefile的原因。构建过程的详细信息实际上记录在您提供的 makefile 中。“Make”会根据哪些源文件已更改,自动计算出需要更新哪些文件。它还会自动确定更新文件的正确顺序,以防一个非源文件依赖于另一个非源文件。

每次我们更改系统的一小部分时重新编译整个程序将是低效的。因此,如果您更改一些源文件然后运行“Make”,它不会重新编译整个东西。它仅更新那些直接或间接依赖于您更改的源文件的非源文件。挺整洁的!

“Make”不限于任何特定语言。对于程序中的每个非源文件,makefile 指定了计算它的 shell 命令。这些 shell 命令可以运行编译器来生成目标文件,链接器来生成可执行文件,ar 来更新库,Makeinfo 来格式化文档等。

“Make”也不仅限于构建包。您还可以使用“Make”来控制安装或卸载包,为其生成标签表,

4. CMake

CMake 代表跨平台制作。CMake 可以识别用于给定类型源的编译器。如果您不知道,您不能使用同一个编译器来构建所有不同类型的源代码。您可以在每次要构建项目时手动执行此操作,但这将是乏味和痛苦的。CMake 为每种类型的目标调用正确的命令序列。因此,没有像 $(CC) 这样的命令的明确说明。

对于真正想要细节的,请继续阅读。如果您不了解所有这些,可以跳到下一部分。

所有处理包含头文件、库等的常用编译器/链接器标志都被平台独立和构建系统独立命令所取代。通过将变量 CMAKE_BUILD_TYPE 设置为“Debug”或在调用程序时将其传递给 CMake,可以包含调试标志:

cmake -DCMAKE_BUILD_TYPE:STRING=Debug.

CMake 还提供了独立于平台的“-fPIC”标志(通过 POSITION_INDEPENDENT_CODE 属性)和许多其他标志。尽管如此,可以在 CMake 和 Makefile 中手动实现更模糊的设置(通过使用 COMPILE_FLAGS 和类似属性)。当然,当第三方库(如 OpenGL)以可移植的方式包含时,CMake 才真正开始大放异彩。

5. 有什么区别?

如果您使用 Makefile,则构建过程有一个步骤,即在命令行中键入“make”。

对于 CMake,有两个步骤:

首先,您需要设置构建环境(通过在构建目录中键入 cmake <source_dir> 或运行一些 GUI 客户端)。这将创建一个 makefile 或类似的东西,这取决于您选择的构建系统(例如,*nix 上的 Make、Windows 上的 VC++ 或 MinGW 等)。构建系统可以作为参数传递给 CMake。但是,CMake 会根据您的系统配置做出合理的默认选择。

其次,您在选定的构建系统中执行实际构建。

我们将在这里进入 GNU 构建系统领域。如果您对此不熟悉,那么这一段对您来说可能看起来像 jibber-jabber。好吧,既然我已经给出了法定警告,那就继续吧!

我们可以将 CMake 与 Autotools 进行比较。当我们这样做时,我们可以看到 Make 的缺点,它们构成了 Autotools 创建的原因。我们还可以看到 CMake 相对于 Make 的明显优势。Autoconf 解决了一个重要问题,即可靠地发现系统特定的构建和运行时信息。但这只是便携式软件开发中的一小部分。为此,GNU 项目开发了一套集成实用程序来完成 Autoconf 开始的工作:GNU 构建系统,其最重要的组件是 Autoconf、Automake 和 Libtool。

“Make”不能做到这一点,至少在不修改它的情况下是不能做到的!你可以让它做所有这些事情,但是跨平台维护它需要很多时间。

CMake 解决了同样的问题,但同时,它比 GNU 构建系统有一些优势:

  • 用于编写 CMakeLists.txt 文件的语言可读且易于理解。
  • 它不仅仅依靠“Make”来构建项目。
  • 它支持多种生成器,如 Xcode、Eclipse、Visual Studio 等。

在比较 CMake 和 Make 时,使用 CMake 有几个优点:

  • 系统库的跨平台发现。
  • 工具链的自动发现和配置。
  • 以与平台无关的方式更容易将文件编译到共享库中,并且通常比 make 更易于使用。

CMake 不仅仅是“Make”,因此它可能更复杂。从长远来看,最好学习如何使用它。如果你只有一个平台上的一个小项目,那么也许“Make”可以做得更好。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一种跨平台编译工具,比Make更为高级,使用起来更加方便。它主要通过编写CMakeLists.txt文件来生成Makefile文件,然后使用make命令来编译源码生成可执行程序或共享库。\[2\]\[3\] CMake可以简单地生成Makefile文件给make工具使用,而make工具可以看作是一个智能的批处理工具,比gcc更高级。\[1\]所以,CMakemake是一对配合使用的工具,CMake负责生成Makefile文件,而make负责根据Makefile文件编译源码。 #### 引用[.reference_title] - *1* [cmakemake详解](https://blog.csdn.net/lxn9492878lbl/article/details/83655152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MakeCMake](https://blog.csdn.net/AAAA202012/article/details/123938845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [makecmake简要介绍](https://blog.csdn.net/Believer_YU/article/details/125612920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值