GCC編譯和鏈接多個文件(包括源文件、目標文件、匯編文件等)


編譯多個源代碼文件會生成多個目標文件,每個目標文件都包含一個源文件的機器碼和相關數據的符號表。除非使用 -c選項指示 GCC 只編譯不鏈接,否則 GCC 會使用臨時文件作為目標文件輸出:

$ gcc -c main.c
$ gcc -c func.c

這些命令會在當前目錄中生成兩個目標文件,分別是 main.o 和 func.o。把兩個源文件名放在同一個 GCC 命令中,也可以獲得同樣的結果:

$ 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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM