我有一个项目的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 +。
答案 0 :(得分:1)
在第一个示例中构建并不会使用 make 重新构建仅修改过的文件的能力。您一直在编译所有 ,然后链接。
如果您使用 make ,(看起来如此,虽然您的第一个示例行并没有从中获益),您只会编译修改源文件。在所有 incremental 情况下,这实际上会导致性能提升(数量取决于构建之间修改后的源文件的数量)。
然而,在发布版本中,通常需要构建所有内容 (make clean; make all),您无法预期性能会提高(你仍然做与原来相同的事情),但可以使用make -j。
编辑:更改问题后:
不,根据生成的可执行文件,构建方法之间没有区别。实际上,两个产生的二进制文件应该是100%相同的。你的第一个gcc行与make + gcc与修改后的makefile
完全相同