在一个命令中编译/链接与在单独命令中编译/链接之间的区别是什么?

时间:2016-03-17 17:22:39

标签: build makefile

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

gcc $(CFLAGS) $(LFLAGS) a.c b.c -o outfile

但这需要很长时间才能生成可执行文件。

在生成的可执行文件(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来并行化构建。

BTW,我们正在使用gcc 5.1 +。

1 个答案:

答案 0 :(得分:1)

在第一个示例中构建并不会使用 make 重新构建仅修改过的文件的能力。您一直在编译所有 ,然后链接。

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

然而,在发布版本中,通常需要构建所有内容 (make clean; make all),您无法预期性能会提高(你仍然做与原来相同的事情),但可以使用make -j。

编辑:更改问题后:

不,根据生成的可执行文件,构建方法之间没有区别。实际上,两个产生的二进制文件应该是100%相同的。你的第一个gcc行与make + gcc与修改后的makefile

完全相同