我在C/C++上编写代码,并使用(GNU)Makefile编译代码.我可以用CMake做同样的事情,并得到一个MakeFile.然而,使用Makefile和CMake编译代码有什么区别?

推荐答案

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

CMake是建筑系统的发电机.它可以生成Makefile,它可以生成忍者构建文件,它可以生成KDEve或Xcode项目,它可以生成Visual Studio解决方案.从相同的起点,相同的CMakeLists.txt文件.因此,如果你有一个独立于平台的项目,CMake是一种让它也独立于构建系统的方法.

如果Windows开发人员习惯于Visual Studio和Unix开发人员对GNU Make深信不疑,那么CMake就是一个不错的 Select .

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

使用buildsystem生成器可以让您的项目更加经得起future 的考验.即使你现在是GNU Make,如果你后来决定扩展到其他平台(无论是Windows还是嵌入式平台),或者只是想使用IDE呢?

C++相关问答推荐

ESP32在vTaskDelay上崩溃

将fget()与strcMP()一起使用不是正确的比较

为什么STM32G474RE上没有启用RCC PLL

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

C中函数类型的前向声明

为什么该函数不将参数值保存到数据 struct 中?

使用scanf在C中读取和存储文件中的值

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

为什么我的Hello World EFI程序构建不正确?

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

在函数外部使用内联ASM时无法指定操作数

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

强制GCC始终加载常量(即只读),即使启用了优化

与指针的原始C数组或C++向量<;向量<;双>>;

无法理解 fgets 输出

变量的指针右对齐,函数的指针左对齐

如何确定 C 程序中的可用堆内存