开始使用c++的Makefile (CMake或GNUMake?)

Getting Started with Makefile for C++(CMake or GNUMake?)

本文关键字:CMake GNUMake Makefile c++ 开始      更新时间:2023-10-16

我得到了我这学期的第一个项目,我被要求提交一个makefile。互联网上的文献资料太多了,再加上我的懒惰,我来到stackoverflow寻求简单的答案。我发现Brendan Long的这个答案是一个很好的开始。

他给出的例子是:

all: a3driver.o
g++ -o a3driver a3driver.o
a3driver.o: a3driver.cpp
g++ -c a3driver.cpp

我能理解。这看起来就像我在Unix系统上看到的make文件,我用它来编译c++文件(只使用,不需要理解)。

然后我进一步搜索,这个问题的答案建议使用CMake,这与我上面粘贴的代码完全不同。

所以我在这个阶段的问题是我应该走哪个方向?我应该学习CMake还是GNUMake?我现在只打算处理c++文件

只有你能回答这个问题,因为它在很大程度上取决于你的需要。Cmake是一个"构建控制文件生成器",不是一个构建控制程序。它实际上并不构建代码:相反,它会创建一个makefile,或者一个Visual Studio/Xcode/Eclipse项目文件等。然后使用构建程序(make, Visual Studio, XCode, Eclipse)来实际构建代码。

如果你需要在所有不同的架构上使用它们的原生构建环境来支持所有不同类型的构建,那么Cmake是很好的选择。如果你愿意在任何你需要构建的架构上使用make (GNU make也可以在所有这些架构上运行,除了Visual Studio之外,所有的ide可能都与本地make有很好的集成),那么直接使用make是很好的。GNU make有许多高级特性,这使它非常灵活。

我不太同意esseks对自动工具的评价,尽管我知道这是一个非常普遍的观点。还要注意,automake本身并没有使用异常的、冗长的语法:automake文件只是makefile。然而,它们必须被处理,而autoconf就是这样做的…根据您的需要,Autoconf虽然没有人们想象的那么糟糕,但却更加晦涩。但是,这里不是讨论这个问题的地方。

我个人觉得cmake格式甚至比autotools更烦人和奇怪,而且它在很多方面都不能满足我的需求(例如它对交叉编译的支持不如autotools’)。然而,我不得不说它生成原生项目文件的能力非常出色——如果你需要的话。

如果您只需要一个非常非常简单的makefile来编译一个或几个文件,那么您就完成了:

compile:
        g++ myprogram.cpp -o myprogram

(注意必须用制表符缩进,而不是空格)。

如果你需要灵活性,你在正确的道路上与CMake。我建议你探索CMake,从他们好的教程或一个简单的例子开始——因为从代码中更容易理解基础知识,而不是从手册中学习。

我个人的意见是避免使用GNU Automake(俗称Autohell),因为它不寻常的、冗长的语法有时会吓到初学者,也会欺骗更有经验的用户。

编辑:CMake不用于编译,相反,它可以为您生成 makefiles,从项目的综合描述开始(要编译的文件在哪里?)需要哪些库?等等)。它通过检查库、识别编译器和执行其他你需要自己编码的完整性检查来做到这一点。