C++ 使用Makefile和CMake编译代码的区别
我在C/C++上编写代码,并使用(GNU)Makefile编译代码。我可以用CMake做同样的事情,并得到一个MakeFile。但是,使用Makefile和CMake编译代码有什么区别?Make(或者更确切地说是Makefile)是一个构建系统-它驱动编译器和其他构建工具来构建代码 CMake是构建系统的生成器。它可以生成makefile,它可以生成Ninja构建文件,它可以生成KDEvelop或Xcode项目,它可以生成visualstudio解决方案。从相同的起点,创建相同的CMakeLists.txt文件。所以,如果您有一个独立于平台的项目,CMake也是一种使其构建系统独立的方法 如果Windows开发人员习惯于Visual Studio和Unix开发人员对GNU Make信誓旦旦,那么CMake就是一个不错的选择 如果您希望您的项目是多平台的或广泛可用的,我总是建议您使用CMake(或其他buildsystem生成器,但CMake是我个人的首选)。CMake本身也提供了一些不错的特性,比如依赖项检测、库接口管理,或者与CTest、CDash和CPack集成C++ 使用Makefile和CMake编译代码的区别,c++,c,makefile,cmake,C++,C,Makefile,Cmake,我在C/C++上编写代码,并使用(GNU)Makefile编译代码。我可以用CMake做同样的事情,并得到一个MakeFile。但是,使用Makefile和CMake编译代码有什么区别?Make(或者更确切地说是Makefile)是一个构建系统-它驱动编译器和其他构建工具来构建代码 CMake是构建系统的生成器。它可以生成makefile,它可以生成Ninja构建文件,它可以生成KDEvelop或Xcode项目,它可以生成visualstudio解决方案。从相同的起点,创建相同的CMakeLis
使用buildsystem生成器可以使您的项目更加经得起未来的考验。即使您现在是GNU Make,但如果您后来决定扩展到其他平台(无论是Windows还是嵌入式平台),或者只是想使用IDE呢?关于CMake是“构建生成器”的说法是一个常见的误解 这在技术上并没有错;它只是描述它是如何工作的,而不是它做什么 在这个问题的上下文中,他们做了同样的事情:获取一堆C/C++文件并将其转换为二进制文件 那么,真正的区别是什么
- CMake更高级。它是专门编译C++的,你可以编写更少的编译代码,但也可以用于通用的构建。code>make也有一些内置的C/C++规则,但它们充其量是无用的
执行两步构建:它在CMake
或ninja
或许多其他生成器中生成低级构建脚本,然后运行它。通常堆积到make
中的所有shell脚本片段仅在生成阶段执行。因此,Makefile
build可以快几个数量级CMake
的语法更易于支持外部工具CMake
- 一旦
构建了一个工件,它就会忘记它是如何构建的。它是从什么来源构建的,什么编译器标志make
跟踪它,CMake
让你自己决定。如果自以前版本的make
以来删除了其中一个库源,Makefile
将不会重建它make
- 现代
(从版本3.something开始)根据“目标”之间的依赖关系工作。目标仍然是单个输出文件,但它可以具有可传递的(“公共”/“接口”在CMake术语中)依赖关系。 这些可传递的依赖项可以向依赖包公开或隐藏CMake
将为您管理目录。使用CMake
,您只能一个文件接一个文件,手动管理目录make
make
中编写一些代码来填补最后两个空白,但这是您自己的事情<代码>制作包含一个(偶数两个,有时三个);前两个是可怕的,而且诡计几乎从未使用过
老实说,这就是CMake
和make
的共同点——它们的语言非常可怕。我想到的是:
- 它们没有用户定义的类型李>
有三种数据类型:字符串、列表和具有属性的目标CMake
有一个:字符串李>make
- 通常通过设置全局变量将参数传递给函数。
- 这在现代CMake中得到了部分处理-您可以设置目标的属性:
李>set_属性(目标helloworld附加属性包括_目录“${CMake_CURRENT_SOURCE_DIR}”)
- 这在现代CMake中得到了部分处理-您可以设置目标的属性:
- 默认情况下,引用未定义的变量会被静默忽略李>