2013-08-12 108 views
9

我有一些C源文件,我正在使用gcc。我基本上想編譯所有這些並創建一個單一的對象文件。當我嘗試:將多個C源文件編譯成一個唯一的目標文件

gcc -c src1.c src2.c src3.c -o final.o 

我得到:

gcc: cannot specify -o with -c or -S with multiple files 

如果我嘗試:

gcc -c src1.c src2.c src3.c 

我得到三個不同的目標文件。我怎麼能告訴gcc編譯所有文件來返回一個單一的目標文件(我也想指定它的名字)?謝謝。

也許還有另一種更常見的方法,在這種情況下,請告訴我。

+1

好的,請告訴我怎麼... – Andry

+0

參閱http:/ /tldp.org/HOWTO/Program-Library-HOWTO/以及瞭解'make' –

+0

順便說一句,你爲什麼要問? –

回答

10

您無法將多個源文件編譯爲單個目標文件。目標文件是單個源文件及其標題的編譯結果(也稱爲translation unit)。

$ ar cr libfoo.a file1.o file2.o file3.o 

然後可以使用連接時,可以直接將它作爲一個目標文件這個靜態庫:

如果你想編譯的文件相結合,它使用的ar命令通常合併成一個靜態庫:

$ gcc file4.o libfoo.a -o myprogram 

或者與它連接的圖書館與-l標誌

$ gcc file4.o -L. -lfoo -o myprogram 
+1

這意味着gcc不能在不同的源文件中內聯函數? –

+3

@CrouchingKitten不是*編譯器*,但*鏈接器*可能能夠進行一些鏈接時優化,這可能包括跨TU(翻譯單元)內聯。 –

4

可能是你正在尋找這樣的:

ld -r src1.o src2.o src3.o -o final.o 

但它總是很高興有他們的存檔,用

ar rvs libmy.a file1.o file2.o file3.o

然後使用-lmy鏈接。

+0

不是'src1.c src2.c src3.c''ld'的源文件,但'src1.o src2.o src3.o' * object * files! –

+0

@BasileStarynkevitch,謝謝,更新 – P0W

9

這不是一種常用的處理方式,但是您可以通過使用以下內容創建新的final.c文件輕鬆實現您的目標。

#include "src1.c" 
#include "src2.c" 
#include "src3.c" 

然後你可以編譯它如下。

gcc -c final.c -o final.o 

請注意,即使每個文件在單獨編譯時編譯成功,也可能存在問題,即讀取編譯錯誤。這種情況往往會發生在宏定義的情況下,並且包括這些源文件合併爲一個單獨的文件。

0

要麼你做一個final.c其中將包括所有.c文件,那麼你可以編譯這個最終使用gcc -c final.c命令。

另一種方法是使用歸檔。建立所有文件,以獲得相應的.o然後存檔,然後在一個庫中將具有所有那些.o文件。

-1

嘗試使用

gcc -o final file1.c file2.c file3.c 

它爲我工作。

+0

這將生成一個二進制文件,這顯然不是問題所要求的(目標文件)。請檢查您的答案或將其刪除以免混淆其他人。 –

3

要多個源文件合併成一個單獨的對象文件(至少自GCC 4.1),使用編譯器/鏈接器選項--combine

(編輯)後與所述編譯選項-flto取代,連接自動根據編譯狀態:Requirements to use flto

+0

不存在? g ++:error:無法識別的命令行選項'--combine' gcc --version gcc(GCC)4.8.3 20140911(Red Hat 4.8.3-7) – gaoithe

+0

It [was removed](https://stackoverflow.com/questions/26804314/gcc-error-unrecognized-command-line-option-combine)在gcc 4.6中。 – Hedede

0

您可以隨時管文件GCC:

join file1.c file2.c file3.c | gcc -x c -c -o single.o - 

不要忘記指定語言的選項,「-xc」,現在無法從文件中可以推斷延期。你告訴GCC接受來自標準輸入的輸入,後面跟着一個破折號「 - 」。

注意,這相當於編譯文件 「final.c」 具有以下內容:

#include "file1.c" 
#include "file2.c" 
#include "file3.c" 

隨着

gcc -c -o single.o final.c 
相關問題