我主要是在业余爱好中从事C ++工作(我还在上学,因此没有一份真正的工作)。IDE为我生成了makefile,所以我想知道是否值得学习如何自己制作它们。我的意思是“值得学习”,我应该在继续学习c ++之前放弃所有东西并学习如何编写它们吗?学习它们真的很有必要吗?如果是这样,我应该了解它们(常规语法和理解它们的工作原理等)还是真正学习如何编写它们?
我主要是在业余爱好中从事C ++工作(我还在上学,因此没有一份真正的工作)。IDE为我生成了makefile,所以我想知道是否值得学习如何自己制作它们。我的意思是“值得学习”,我应该在继续学习c ++之前放弃所有东西并学习如何编写它们吗?学习它们真的很有必要吗?如果是这样,我应该了解它们(常规语法和理解它们的工作原理等)还是真正学习如何编写它们?
Answers:
是的,绝对值得了解Makefile的工作方式。现在可能与您不相关(因为您正在使用生成它们的IDE),但是这种知识很有可能在将来有用。
我的意思是“值得学习”,我应该在继续学习c ++之前放弃所有东西并学习如何编写它们吗?
坦白说,这是“值得学习”的怪异概念。
但是,不,我认为您不需要这样做。
学习它们真的很有必要吗?
我们无法预测您将来是否真的需要此知识。这取决于您是否继续进行C ++编程以及在何种环境下进行编程。
如果是这样,我应该了解它们(常规语法和理解它们的工作原理等)还是真正学习如何编写它们?
我都推荐。如果您不能编写Makefile,则知道发生了什么是有争议的。
还有一种观点认为,过多的知识无济于事。
如果深入了解这一点,您将了解到有许多不同版本的Make,并且很难在多个平台上编写适用于多个版本的Make的复杂Makefile。然而,在开源的世界里,它是“最佳实践”来使用的工具,如automake
,autoconf
等产生的生成文件,等等。如果你这样做,有很多版本/平台相关的复杂性被处理的幕后。
最后,您用“ java”标记了问题。我的观点是,您不应该make
用来构建Java应用程序(除非您也正在构建本机代码库)。有一些Java特定的构建工具易于使用...并且比make
。
如果您使用的是开源或类似Unix的操作系统,则可以。振作起来,它们并不那么复杂。make
从长远来看,学习将为您节省大量时间。
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确实存在一些局限性,当项目变得复杂时,它们会抬起头来。
我有偏见,因为我认为makefile是一个糟糕的系统。您应该学习通用语法,以便可以修改现有的makefile。但是我不认为学习所有内容或从头开始做都是有用的。
出于多种原因,学习如何编写Makefile是一个好主意。
您应该始终尝试了解所使用的构建系统。
这并不一定意味着您必须能够手动创建所有构建文件。重要的部分是了解构建系统对项目的作用以及手动编译小型项目的一般能力(例如“在终端上键入命令”)。
我只是倾向于认为创建(简单的)Makefile是了解正在发生的事情的最简单的步骤,但是您可能还有其他了解如何构建事物的方法。
如果您仅保留Windows编程,并且不希望其他人来编译您的代码,请随意编译您喜欢的代码。
如果您要编写与编译器无关的程序(如“让其他人决定他们要使用的编译器或IDE”),那么您应该学习另一个构建系统,而不只是让您的IDE处理。
如果要为不同的平台编程,那么您当然需要使用广泛的构建系统。
这仍然并不意味着您必须知道自动生成的Makefile如何详细工作。您只需要知道构建系统的输入文件是如何工作的。这些有时恰好具有类似的语法。
我个人非常喜欢Makefile,并将它们用于许多用途。不只是编译代码。我为我创建的每个更大的pdf(使用LaTeX)以及每个项目都需要自动化的一些任务创建一个Makefile(构建,打包,上传,更新源存储库中的依赖项,拉/推手动备份)
但是,我在终端上进行了大量工作,并且正在使用Linux。除了vim(强大的文本编辑器)和控制台工具之外,我不使用您称为IDE的东西。这对您来说可能会大不相同。
如果您曾经抱怨只为了“更新” / package / upload / ..“项目”而不得不运行其他重复发生的命令,那么学习如何编写Makefile可能对您有所帮助。
如果您拥有所有工具并使用工具/ GUI / IDE,那么您可能不会从这些知识中学到任何东西。