提问者:小点点

使用 Makefile 和 CMake 编译代码有什么区别?


我用C/C编码并使用(GNU)Makefile来编译代码。我可以用CMake做同样的事情并得到一个Makefile。但是,使用Makefile和CMake编译代码有什么区别?


共3个答案

匿名用户

Make(或者更确切地说是Makefile)是一个构建系统 - 它驱动编译器和其他构建工具来构建你的代码。

CMake是buildsystems的生成器。它可以生成Makefiles,可以生成Ninja构建文件,可以生成KDEvelop或Xcode项目,可以生成Visual Studio解决方案。从同一个起点,同一个CMakeLists.txt文件。因此,如果你有一个独立于平台的项目,CMake也是一种让它独立于系统构建的方法。

如果你有习惯于Visual Studio的Windows开发人员和对GNU Make深信不疑的Unix开发人员,CMake是一个不错的选择。

如果您希望您的项目是多平台的或广泛可用的,我总是推荐使用CMake(或另一个buildsystem生成器,但CMake是我个人的偏好)。CMake本身也提供了一些不错的特性,比如依赖性检测、库接口管理,或者与CTest、CDash和CPack的集成。

使用构建系统生成器使您的项目更具前瞻性。即使你现在只有GNU-Make,如果你后来决定扩展到其他平台(无论是Windows还是嵌入式平台),或者只是想使用IDE,该怎么办?

匿名用户

关于CMake是“构建生成器”的说法是一个常见的误解。

这在技术上并没有错;它只是描述了它是如何工作的,而不是它的作用。

在这个问题的上下文中,他们做了同样的事情:取一堆C/C文件并将其转换为二进制文件。

那么,真正的区别是什么?

>

  • CMake要高级得多。它是为编译C量身定制的,您可以为此编写更少的构建代码,但也可以用于通用构建。make也有一些内置的C/C规则,但充其量是无用的。

    CMake执行两步构建:它在ninjamake中或许多其他生成器中生成一个低级构建脚本,然后运行它。所有通常堆到Makefile的shell脚本片段只在生成阶段执行。因此,CMake构建可以快几个数量级。

    < code>CMake的语法比Make的语法更容易支持外部工具。

    一旦使构建成为工件,它就会忘记它是如何构建的。它是从什么来源构建的,什么编译器标志?CMake 跟踪它,让它由你决定。如果自上一版本的 Makefile 以来删除了其中一个库源,则 make 不会重建它。

    现代CMake(从3.something版本开始)在“目标”之间的依赖性方面起作用。目标仍然是单个输出文件,但它可以具有可传递的(CMake术语中的“public”/“interface”)依赖关系。这些可传递的依赖项可以向依赖包公开,也可以从依赖包隐藏CMake将为您管理目录。使用make,您将被困在一个文件一个文件上,并手动管理目录。

    您可以使用中间文件在make中编写一些内容来弥补最后两个空白,但您只能自己编写make确实包含一个图灵完备语言(甚至两个,有时三个计算Guile);前两个很可怕,Guile实际上从未被使用过。

    老实说,这就是CMakemake的共同点——它们的语言非常糟糕。我想到的是:

      < li >它们没有用户定义的类型; < li>CMake有三种数据类型:字符串、列表和带有属性的目标。< code>make有一个:string < li >通常通过设置全局变量将参数传递给函数。 < ul > < li >这在现代CMake中得到部分解决-您可以设置目标的属性:< code > set _ PROPERTY(TARGET hello world APPEND PROPERTY INCLUDE _ DIRECTORIES " $ { CMake _ CURRENT _ SOURCE _ DIR } " ;

  • 匿名用户

    正如在其他答案中提到的,CMake可以生成其他项目文件。它将这些项目称为发电机。

    这允许用户使用领域特定的语言编写/描述他们的构建,并使用生成器来编译项目。与直接写入这些项目文件相比,它通常会产生更简单/更好的代码。

    一个很大的优势是用户可以使用他们最熟悉的工具(Makefile、Visual Studio、XCode、Ninja等)。这很好,但有争议会带来复杂性。为什么不直接使用Ninja呢?

    答案是历史。(这是C/C中的规范)

    Visual Studio等构建系统具有仅接受这些项目文件的工具。

    例如,微软有一个特性叫做“静态驱动验证”。一个分析内核态windows驱动程序代码的工具。但是,此工具仅适用于Visual Studio项目,因为它与< code>msbuild一起使用。

    msbuild /t:sdv /p:Inputs="Parameters" ProjectFile /p:Configuration=configuration /p:Platform=platform
    

    如果您的生成系统无法生成Visual Studio项目文件,则无法使用该工具。对于一些项目/公司来说,这可能是一件大事。