Build 什么';在一个命令中编译/链接与在单独的命令中编译/链接有什么区别?

Build 什么';在一个命令中编译/链接与在单独的命令中编译/链接有什么区别?,build,makefile,Build,Makefile,我为一个项目准备了一个makefile,其中可执行文件对性能敏感,并且包含许多内联asm序列以及一些调用这些序列的C代码。现在,我们通过在一个compile/link命令中列出所有C文件来构建可执行文件,如下所示: gcc $(CFLAGS) $(LFLAGS) a.c b.c -o outfile gcc $(CFLAGS) -c a.c -o a.o gcc $(CFLAGS) -c b.c -o b.o gcc $(LFLAGS) a.o b.o -o outfile 但这需要很长时间

我为一个项目准备了一个makefile,其中可执行文件对性能敏感,并且包含许多内联asm序列以及一些调用这些序列的C代码。现在,我们通过在一个compile/link命令中列出所有C文件来构建可执行文件,如下所示:

gcc $(CFLAGS) $(LFLAGS) a.c b.c -o outfile
gcc $(CFLAGS) -c a.c -o a.o
gcc $(CFLAGS) -c b.c -o b.o
gcc $(LFLAGS) a.o b.o -o outfile
但这需要很长时间才能生成可执行文件

生成的可执行文件(outfile)在性能方面是否与分解编译和链接有任何区别,如下所示:

gcc $(CFLAGS) $(LFLAGS) a.c b.c -o outfile
gcc $(CFLAGS) -c a.c -o a.o
gcc $(CFLAGS) -c b.c -o b.o
gcc $(LFLAGS) a.o b.o -o outfile
这将加快构建速度,因为我们将执行增量构建,并且我们还可以使用make-j来并行化构建


顺便说一句,我们使用的是gcc 5.1+。

在您的第一个示例中构建不会利用make只重新构建修改过的文件的功能。您一直在编译所有内容,然后链接

如果您使用make(看起来是这样的,尽管您的第一个示例行并没有从中受益),您将只编译修改过的源文件。在所有增量情况下,这实际上会导致性能提升(数量取决于构建之间修改的源文件数量)

但是,在发布版本中,通常希望您构建所有内容(makeclean;makeall),您不能期望性能提高(您仍然执行与最初相同的操作),但可以使用make-j

编辑:更改问题后:


不,在生成的可执行文件方面,to-build方法之间没有区别。实际上,产生的两个二进制文件应该是100%相同的。您的第一行gcc与make+gcc对修改后的makefile的作用完全相同

您可能需要研究make和makefile的实际含义。提示:您的第一个变体正好相反。gcc不是一个链接器或构建工具。你的问题与gcc和C无关。谢谢,刚刚编辑过。我想我原来的帖子让人困惑。我刚刚编辑了它。可执行文件是性能敏感的(如果它使可执行文件运行变慢,我不想更改构建方法)。我知道我可以通过将构建分解为单独的步骤来提高构建速度,但我不知道生成的可执行文件是否会更慢。将main放在outfile.c中,并将生成文件设为一行:
outfile:a.o b.o outfile.o
。让我们为你的工作制定隐含的规则。隐式规则将尊重CFLAG,LDFLAGS和LDLIB也是如此。单行Makefile将为您提供增量构建,这将与非增量构建相同。请留下评论并投反对票,谢谢!我觉得我原来的帖子让人困惑。我刚刚编辑了它。可执行文件是性能敏感的(如果它使可执行文件运行变慢,我不想更改构建方法)。我知道我可以通过将构建分解为不同的步骤来提高构建速度,但我不知道生成的可执行文件是否会更慢。