Makefile可以编译多个C程序?


71

这是一个非常简单的问题,但是我是makefile的新手。我正在尝试制作一个将编译两个独立程序的makefile:

在线上的所有示例都比我需要的更多细节,令人困惑!我真正想要做的就是运行这两gcc行。我究竟做错了什么?


3
下面的答案很明确,但是您也可以运行命令行:make program1 program2在您自己给出的示例中,这将调用两个目标。如果只需要program1,则可以只运行make(它将运行第一个目标)。如果您只想program2运行make program2。您拥有更多控制权。当然,一个目标all: program1 program2会做到这一点(成为第一个目标,运行另外两个目标)。做完了
DrBeco

Answers:


79

像这样做

您说过您不想要高级内容,但是您也可以根据一些默认规则将其缩短。


6
请注意,如果要自动构建两个程序,则all目标必须出现在makefile中的各个程序之前,并且是makefile中的第一个目标。
兰德尔·库克2014年

3
你可以把all或任何你想要的任何其他的目标,并使其成为默认目标以下(你叫什么“自动”)的运行make使用.DEFAULT_GOAL:=all
underscore_d

28

模式规则使您可以编译多个c文件,这些文件需要使用相同的编译命令make,如下所示:


24

1
感谢上面的代码。我用它来编译我的.c文件。但是,如果我更改了任何myHeader.h文件,则需要在使用'make'之前重新保存.c文件,否则它显示为“ make:对于'all'不需要做任何事情”。而实际上已在.h文件中进行了更改。我们可以修改make文件以在.h文件中进行任何更改后编译,而无需重新保存.c文件吗?并感谢上面的代码!
jatin3893

谢谢分配。这对我来说非常有用:)
SHRI 2013年

谢谢,这就是我想要的!
ElBaulP 2014年

4
“链接后,应立即自动删除$(OBJS)。” 难道这不会导致不必要的重新编译,并因此大体上破坏了的观点make吗?
underscore_d

你为什么.SECONDEXPANSION呢?
crisron

10

2

我更喜欢ansi和pedantic,它可以更好地控制您的程序。当您仍然有警告时,它不会让您编译!


2
那不是-pedantic为了什么。-pedantic将会删除甚至-ansi允许的所有非ansi功能。
cnicutar,2011年

3
要添加到nicututar的评论中,-Werror会将警告更改为错误。
jtniehof 2011年

1

一个简单程序的编译工作流程很简单,我可以将其绘制为一个小图:源-> [编译]->对象[链接]->可执行文件。此图中有文件(源,对象,可执行文件)和规则make的术语)。该图在Makefile中定义

启动make时,它将读取Makefile,并检查更改的文件。如果有的话,它会触发rule,取决于它。该规则可能会生成/更新其他文件,这可能会触发其他规则,依此类推。如果创建一个良好的makefile,则仅运行必要的规则(编译器/链接命令),这些规则从依赖路径中的已修改文件“到下一个”。

选择一个示例Makefile,阅读手册中的语法(无论如何,一目了然,没有手册),然后绘制图表。您必须了解编译器选项才能找出结果文件的名称。

生成图应尽可能复杂。您甚至可以执行无限循环!您可以告诉make,哪个规则是您的目标,因此只有左侧的文件将用作触发器。

再次:绘制图形


1

这会将所有*.c文件编译make为可执行文件,而没有.c扩展名(如)gcc program.c -o program

make会自动添加你加入任何标志CFLAGS一样CFLAGS = -g Wall

如果不需要,CFLAGS可以将任何标志保留为空白(如下所示)或完全省略。


0

make all 会做:

如果设置CXXCXXFLAGS变量make将使用它们。


2
你是说a.cpp -o a
Shane Abram Mendez'3
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.