1

我有本学期的第一个项目,我被要求用 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++ 文件。

4

2 回答 2

1

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

如果您需要使用原生构建环境在所有不同架构中支持所有这些不同类型的构建,Cmake 是很好的选择。如果您乐于在需要构建的任何架构上使用 make(GNU make 也可以在所有这些架构上运行,并且所有这些 IDE 可能除了 Visual Studio 与本机 make 有很好的集成),那么直接使用 make 就可以了。GNU make 有许多高级特性,使其非常灵活。

尽管我知道这是一个非常普遍的观点,但我并不真正同意 esseks 对 autotools 的评估。另请注意,automake 本身不使用不寻常的、冗长的语法:automake 文件只是 makefile。然而,它们必须被处理,而 autoconf 就是这样做的...... autoconf 更加晦涩,尽管没有人们想象的那么糟糕,具体取决于您的需要。然而,这不是讨论的地方。

我个人觉得 cmake 格式比 autotools 更烦更奇怪,而且它在很多方面都不能满足我的需求(例如它对交叉编译的支持不如 autotools)。但是我不得不说它生成本地项目文件的能力真的很棒——如果你需要的话。

于 2013-05-06T14:30:20.010 回答
1

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

compile:
        g++ myprogram.cpp -o myprogram

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

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

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

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

于 2013-05-06T14:06:44.447 回答