学习makefile有多重要?[关闭]


12

我主要是在业余爱好中从事C ++工作(我还在上学,因此没有一份真正的工作)。IDE为我生成了makefile,所以我想知道是否值得学习如何自己制作它们。我的意思是“值得学习”,我应该在继续学习c ++之前放弃所有东西并学习如何编写它们吗?学习它们真的很有必要吗?如果是这样,我应该了解它们(常规语法和理解它们的工作原理等)还是真正学习如何编写它们?


1
大多数开源项目都以一种或另一种方式大量使用makefile。因此,是的,您应该了解makefile如何工作。用手编写它们是另一回事,应该优先使用某些工具来生成它们,除非您的文件很少,或者可以使用通用/隐式规则和其他类似技术
permeakra 2012年

如果您想让其他人在Linux和其他基于Unix的操作系统上编译您的源代码,则需要学习它们。

您可以花更少的时间来阅读makefile文件,依赖项和替换项等基础知识,从而花更少的时间阅读该问题的所有答案:)
JohnB 2012年

Answers:


14

是的,绝对值得了解Makefile的工作方式。现在可能与您不相关(因为您正在使用生成它们的IDE),但是这种知识很有可能在将来有用。

我的意思是“值得学习”,我应该在继续学习c ++之前放弃所有东西并学习如何编写它们吗?

坦白说,这是“值得学习”的怪异概念。

但是,不,我认为您不需要这样做。

学习它们真的很有必要吗?

我们无法预测您将来是否真的需要此知识。这取决于您是否继续进行C ++编程以及在何种环境下进行编程。

如果是这样,我应该了解它们(常规语法和理解它们的工作原理等)还是真正学习如何编写它们?

我都推荐。如果您不能编写Makefile,则知道发生了什么是有争议的。

还有一种观点认为,过多的知识无济于事。

如果深入了解这一点,您将了解到有许多不同版本的Make,并且很难在多个平台上编写适用于多个版本的Make的复杂Makefile。然而,在开源的世界里,它是“最佳实践”来使用的工具,如automakeautoconf等产生的生成文件,等等。如果你这样做,有很多版本/平台相关的复杂性被处理的幕后。


最后,您用“ java”标记了问题。我的观点是,您不应该make用来构建Java应用程序(除非您也正在构建本机代码库)。有一些Java特定的构建工具易于使用...并且比make


8

如果您使用的是开源或类似Unix的操作系统,则可以。振作起来,它们并不那么复杂。make从长远来看,学习将为您节省大量时间。


学习阅读还是写作?

都。您想知道如何阅读它,以便可以调试所用软件或编写的问题,从而可以创建自己的软件。
EhevuTov 2012年

然后我不得不不同意写作部分。还有许多其他方法-可以说是更好的方法-可以自动进行构建。编写实际上有用的makefile并非易事,而且不是必需的。

3

Makefile在UNIX系统(例如AIX,Linux,OS X)上很重要。但是,我认为他们的绝对“您必须知道”的重要性近年来有所减少。例如,在Windows开发(Visual Studio等)中并没有真正找到它们,而XCode(在OS X上)完全使用了另一个系统。我对Java的了解不多,但是我认为它们使用ant文件而不是其他东西。

有一个非常酷的系统,称为CMake,它会为您恰巧在其上运行的操作系统生成本机生成文件。例如,如果您用CMake编写项目规范,则可以在Windows上创建Visual Studio构建项目,在Mac上创建XCode项目,在Linux上创建Makefile。在某种程度上,CMake取代了autoconf和automake。

我通常为“大项目”创建CMake文件,但我知道Make,以防我想编写一个快速的“只需完成”的Makefile。这对您的文化素养很有好处,因为有成千上万个使用Makefile的软件库,并且您将不可避免地需要编辑特定的编译器和库位置。但是您会发现大型项目(如KDE)正在向CMake等迁移,因为Make确实存在一些局限性,当项目变得复杂时,它们会抬起头来。


学习CMake将更加有益。Makefile可以看作是实现的细节-不必像学习Visual Studio项目文件那样费心地学习它们(直到真正被迫这样做)。

2

我有偏见,因为我认为makefile是一个糟糕的系统。您应该学习通用语法,以便可以修改现有的makefile。但是我不认为学习所有内容或从头开始做都是有用的。


认真解释为什么makefile是一个糟糕的系统?比起什么?
JonnyJD 2012年

@JonnyJD:一件事是,我不认为一个好的构建系统应该在每个子目录中放置一个make文件。但这很不好,因为它使用起来并不容易,然后编写了一个bat文件。

听起来更像您不喜欢手动生成构建文件。这本身没什么大不了的。Makefile是一个变体,应该可以手动读取和写入。(模块化,与bash / bat相比,仅简化了依赖性跟踪)自动化部分是automake。实际上唯一的不同是在GUI中指定依赖项并将所有这些都保存在一个项目文件中。还是那么糟糕的构建系统?
JonnyJD 2012年

2

与IDE输出的许多方面一样,典型的自动生成的makefile的结构通常效率不高。

有了适当的了解水平,通常可以显着提高性能(更快的构建等)。但是,除非您真的知道发生了什么,否则在摆弄自动生成的文件时,您更有可能会陷入困境。

我强烈建议您能够了解发生了什么……是您随后选择开始编辑现有的还是创建自己的,是一个单独的问题。


2

能够成功使用make或类似的工具,使您可以选中“了解如何对由多个模块组成的程序各部分之间的依赖关系进行建模”框。


1

出于多种原因,学习如何编写Makefile是一个好主意。

  1. Make是一种使您可以通过规则对组件之间的依赖关系进行编码的语言。通过这种方式编写代码,您将获得很多经验,并且拓宽了您考虑解决编程问题的工具。
  2. 如果您选择学习Java或Ruby世界中的编程,那么使用Make学习的原理可以与Ant,Maven和Rake一起使用。
  3. 许多IDE都有魔术文件,这些魔术文件包含配置信息以帮助您构建软件。如果您不相信我,请尝试编写一个脚本来构建没有IDE的软件。当您编写自己的Makefile时,您会非常了解代码,库和环境变量之间的依赖关系。随着系统的变大,这实际上是调试系统的有用工具。

0

您应该始终尝试了解所使用的构建系统。

这并不一定意味着您必须能够手动创建所有构建文件。重要的部分是了解构建系统对项目的作用以及手动编译小型项目的一般能力(例如“在终端上键入命令”)。

我只是倾向于认为创建(简单的)Makefile是了解正在发生的事情的最简单的步骤,但是您可能还有其他了解如何构建事物的方法。

为什么/何时学习Makefile

如果您仅保留Windows编程,并且不希望其他人来编译您的代码,请随意编译您喜欢的代码。

如果您要编写与编译器无关的程序(如“让其他人决定他们要使用的编译器或IDE”),那么您应该学习另一个构建系统,而不只是让您的IDE处理。

如果要为不同的平台编程,那么您当然需要使用广泛的构建系统。

这仍然并不意味着您必须知道自动生成的Makefile如何详细工作。您只需要知道构建系统的输入文件是如何工作的。这些有时恰好具有类似的语法。


我个人非常喜欢Makefile,并将它们用于许多用途。不只是编译代码。我为我创建的每个更大的pdf(使用LaTeX)以及每个项目都需要自动化的一些任务创建一个Makefile(构建,打包,上传,更新源存储库中的依赖项,拉/推手动备份)

但是,我在终端上进行了大量工作,并且正在使用Linux。除了vim(强大的文本编辑器)和控制台工具之外,我不使用您称为IDE的东西。这对您来说可能会大不相同。

如果您曾经抱怨只为了“更新” / package / upload / ..“项目”而不得不运行其他重复发生的命令,那么学习如何编写Makefile可能对您有所帮助。

如果您拥有所有工具并使用工具/ GUI / IDE,那么您可能不会从这些知识中学到任何东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.