編譯多個源代碼文件會生成多個目標文件,每個目標文件都包含一個源文件的機器碼和相關數據的符號表。除非使用
一旦所有當前源文件都被編譯為目標文件,就可以使用 GCC 來鏈接它們:
GCC 也支持以下擴展名:.ii、.cc、.cp、.cxx、.cpp、.CPP、.c++、.C、.hh、.H、.m、.mi、.f、.for、.FOR、.F、.fpp、.FPP、.r、.ads 和 .adb。這些文件類型涉及 C++、Objective-C、Fortran 或 Ada 等程序的編譯。使用其他擴展名的文件會被視為對象文件,以作為鏈接之用。
如果使用其他命名慣例為輸入文件命名,可以使用
在命令行中,
-c
選項指示
GCC 只編譯不鏈接,否則 GCC 會使用臨時文件作為目標文件輸出:
$ gcc -c main.c
$ gcc -c func.c
$ gcc -c main.c func.c
然而,實際上編譯器通常每次只會被調用來完成一件小型任務。大的程序包含許多源文件,在開發期間必須被編譯、測試、編輯,然后再編譯,很少會有在創建中的修改行為會影響所有的源文件。為了節省時間,可以使用 make 控制創建過程,由它調用編譯器重新編譯,而且只編譯比對應的最新源文件舊的那些目標文件。一旦所有當前源文件都被編譯為目標文件,就可以使用 GCC 來鏈接它們:
$ gcc main.o func.o -o app.out -lm
GCC 假設擴展名為.o
的文件是要被鏈接的目標文件。
文件類型
編譯器支持許多和 C語言程序相關的擴展名,對它們的說明如下:擴展名(后綴) | 說明 |
---|---|
.c | C程序源代碼,在編譯之前要先進行預處理。 |
.i | C程序預處理輸出,可以被編譯。 |
.h | C程序頭文件。(為了節省時間,許多源文件會包含相同的頭文件,GCC 允許事先編譯好頭文件,稱為“預編譯頭文件”,它合適情況下自動被用於編譯。) |
.s | 匯編語言。 |
.S | 有C命令的匯編語言,在匯編之前必須先進行預處理。 |
GCC 也支持以下擴展名:.ii、.cc、.cp、.cxx、.cpp、.CPP、.c++、.C、.hh、.H、.m、.mi、.f、.for、.FOR、.F、.fpp、.FPP、.r、.ads 和 .adb。這些文件類型涉及 C++、Objective-C、Fortran 或 Ada 等程序的編譯。使用其他擴展名的文件會被視為對象文件,以作為鏈接之用。
如果使用其他命名慣例為輸入文件命名,可以使用
-x file_type
選項來指示 GCC 應該如何對待這些文件。file_type 必須是下面其中之一:c、c-header、cpp-output、assembler(表示該文件包含匯編語言)、assembler-with-cpp 或 none。
在命令行中,
-x
后面所列的所有文件都會被視為所指定的類型。如果想改變類型,可以再次使用
-x
。如下例所示:
$ gcc -o bigprg mainpart.c -x assembler trickypart.asm -x c otherpart.c
可以在同一個命令行中多次使用-x
選項,以指示不同類型的文件。
-x none
選項會全部取消這些指示,后續文件會按照 GCC 默認規則解釋它們的擴展名。
混合輸入類型
可以在 GCC 命令行中混合使用其他輸入文件類型。如果編譯器不能按照請求處理指定的文件,那么它會忽略它們。如下例所示:$ gcc main.c func.o -o app.out -lm
借助於這個命令,假設指定的文件都存在,GCC 會編譯和匯編 main.c,匯編 func.o,並且鏈接庫文件 libm.a。