Makefiles,我怎么使用它们?

^这不是一个重复的问题^

更新

我对编程相当陌生,而现在我只是碰到了makefile。

在过去的几个月里,我已经从各种地方下载了大量的教程和源代码。 直到现在我只使用VS解决scheme,并一直在避免它们。

我已经看到了在谷歌上使用Makefiles的多种方法,但它们的复杂性都不相同。

我不知道他们或如何使用他们的线索。 谢谢。

编辑(重新措辞):

总而言之,由于明显的混淆,我的问题是(而且总是):

1) Is there a good tutorial that comes recommended or is it easy to get started with Makefiles? 2) How do you launch and run an existing Makefile? And, 3) Do Makefiles hold any vital data about the program or could I just use the `.h` and `.cpp` files that come with them in a new solution built from scratch? 

什么时候使用Makefile是个问题。 当然,你可以使用一些替代build设者 (如omake ,但还有很多其他的)。 只要软件中有多个翻译单元,您当然需要一些build筑系统。 如果使用make Makefile描述构build过程,通过详细说明依赖关系。 通常,编写程序只是通过简单的make命令完成的。

一些工具,例如cmake , qmake , automake等等都是Makefile 生成器 他们生成一个复杂的Makefile ,通常不会使用GNU make的所有function。

如果你决定使用make ,我推荐使用GNU make (这也是一个意见)。 在这种情况下,仔细阅读它的文档 ,我发现它非常易读,其中包含一个很好的教程。 不要忘记使用最新版本:GNU make的4.0版本于2013年10月发布,并带来了许多有趣的新function(插件,最重要的是可扩展性通过诡计 ),这些function对于复杂的构build是有趣的。

debugging复杂的Makefile -s考虑使用重制 (尤其是remake -x )。

实际上, GNU make有很多内置的规则。 你用make -p得到它们; 所以使用它们。

您也可以select编写POSIX make实用程序 (这是一个标准规范 ,但不如GNU make那样强大,可以按照POSIX规范进行configuration)。

如何对Makefile进行编码是一个Makefile的事情,也是软件复杂性的问题。 如果你有2个或3个*.cc文件,只有一个.h公共头文件,你不需要所有的花式技巧(比如自动依赖 ,由GCC和make )文件(有时会生成C ++源代码,所以构build系统必须知道这一点)。

这里有一个小小的GNU Makefile来帮助你:

 ## file Makefile CXX= g++ CXXSOURCES= main.cc other.cc CXXOBJECTS= $(patsubst %.cc, %.o, $(CXXSOURCES)) OPTIMFLAGS= -g -O PACKAGES= glib-2.0 PKGCONFIG= pkg-config CXXFLAGS= -std=c++11 -Wall $(OPTIMFLAGS) CPPFLAGS:= $(shell $(PKGCONFIG) --cflags $(PACKAGES)) LIBES:= $(shell $(PKGCONFIG) --libs $(PACKAGES)) -ldl .PHONY: all clean all: myprog myprog: $(CXXOBJECTS) $(LINK.cc) -rdynamic $^ $(LIBES) -o $@ $(CXXOBJECTS): yourheader.h clean: $(RM) *.o *.so *.orig *~ myprog core* *.hh.gch ## eof Makefile 

我不认为这是一个完美的例子(不是)。 小心,制表是重要的,我不能在上面input。 您将使用make all (或只是make )来构build您的程序,并将其make clean为删除非源文件。

出于难以理解的原因,有时Makefile可能使用autotools或cmake生成。 对于简单的程序,可能不值得努力学习如何使用它们。

有几种情况,当GNU make是不值得的或者不合适的时候:在MELT中,我几乎放弃了使用它(通过调用一些autogen生成的shell脚本),因为它是一种引导语言,其中一组C ++文件从设置MELT文件,所以你有一个多重的准循环依赖关系。 可能使用GUILE扩展可能会有很多帮助。 但是这种噩梦般的情况并不多见。

PS:我是以Linux用户的身份回答的。 不知道什么适用 – 或不适用于Windows,我从来没有使用。 另请参阅有关Linux上C或C ++编程的提示 。

PS2: Paul Evans的答案是相关的:不要编写自己的Makefile ,复制一些现有的Makefile以满足您的需求。

开始推出自己的makefile时,成功的基本概念不是 ! 总是抓一个类似的,简单的工作 makefile作为模板,并将其改为自己的版本。 只有通过努力,才有可能通过勤奋的阅读和学习,来寻求改进的方法,使其更通用。 然后有一天可能会来到遥远的未来,你可以从头开始编写一个makefile 。 但是,如果那一天没有到来,不要失望。

如果你要求一个好的教程,那么我认为这个是好的! 你可以完全按照它。 我通过它了解了make文件。