2016-03-17 98 views
-1

我有一個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來並行化構建。

順便說一下,我們使用的是gcc 5.1+。

+0

你可能想要研究make和makefiles實際上的想法是什麼。提示:你的第一個變種是完全相反的。而gcc不是鏈接器或構建工具。你的問題既不是gcc也不是C相關的。 – Olaf

+0

謝謝,剛剛編輯。 –

+0

我覺得我原來的帖子很混亂。我剛剛編輯它。可執行文件對性能非常敏感(如果它使可執行文件運行速度較慢,我不想更改構建方法)。我知道我可以通過將構建分解成單獨的步驟來提高構建速度,但我不知道結果可執行文件是否會變慢。 –

回答

1

建築像你的第一個例子一樣不使用使能夠重新構建只修改過的文件。您正在編譯的一切所有的時間,然後鏈接。

只要你使用使,(它看起來像這樣,雖然你的第一個例子行不benefiit從它在所有),你會只編譯修改源文件。在所有增量的情況下,這實際上會導致性能提升(數量取決於構建之間修改的源文件的數量)。

在發佈版本,但是,在這裏你一般會被預計建成一切(使清潔;使所有),你不能指望的性能提升(你還在做同樣的事情最初)但可以使用make -j。

編輯:當你改變了一個問題:

沒有,有沒有什麼區別打造生成的可執行文件條款的作法。實際上,這兩個二進制文件應該是100%相同的。你的第一個gcc代碼行與make + gcc做的修改後的makefile代碼完全一樣

+0

我認爲我原來的帖子很混亂。我剛剛編輯它。可執行文件對性能非常敏感(如果它使可執行文件運行速度較慢,我不想更改構建方法)。我知道我可以通過將構建分解成單獨的步驟來提高構建速度,但我不知道結果可執行文件是否會變慢。 –