檔案型別

編譯 C 程式需要你使用五種檔案:

  1. 原始檔 :這些檔案包含函式定義,其名稱按慣例以 .c 結尾。注意:.cc.cpp 是 C++檔案; 不是 C 檔案。
    例如,foo.c

  2. 標頭檔案 :這些檔案包含函式原型和各種前處理器語句(見下文)。它們用於允許原始碼檔案訪問外部定義的函式。標頭檔案按照慣例以 .h 結尾。
    例如,foo.h

  3. 目標檔案 :這些檔案是作為編譯器的輸出生成的。它們由二進位制形式的函式定義組成,但它們本身不可執行。按照慣例,物件檔案以 .o 結尾,雖然在某些作業系統(例如 Windows,MS-DOS)上,它們通常以 .obj 結尾。
    例如,foo.o foo.obj

  4. 二進位制可執行檔案 :這些是作為名為連結器的程式的輸出生成的。連結器將許多目標檔案連結在一起以生成可以直接執行的二進位制檔案。二進位制可執行檔案在 Unix 作業系統上沒有特殊字尾,儘管它們通常在 Windows 上以 .exe 結尾。
    例如,foo foo.exe

  5. :庫是一個已編譯的二進位制檔案,但它本身並不是一個可執行檔案(即庫中沒有 main() 函式)。庫包含可由多個程式使用的函式。庫應附帶標頭檔案,其中包含庫中所有函式的原型; 應在任何使用該庫的原始檔中引用這些標頭檔案(例如; #include <library.h>)。然後需要將連結器引用到庫中,以便程式可以成功編譯。有兩種型別的庫:靜態和動態。

    • 靜態庫 :靜態庫(用於 POSIX 系統的 .a 檔案和用於 Windows 的 .lib 檔案 - 不要與 DLL 匯入庫檔案混淆,也使用 .lib 副檔名)靜態內建到程式中。靜態庫的優點是程式確切地知道使用哪個版本的庫。另一方面,可執行檔案的大小更大,因為包含了所有使用的庫函式。
      例如,libfoo.a foo.lib
    • 動態庫 :動態庫(大多數 POSIX 系統的 .so 檔案,OSX 的 .dylib 和 Windows 的 .dll 檔案)在程式執行時動態連結。這些有時也被稱為共享庫,因為許多程式可以共享一個庫映像。如果多個應用程式正在使用庫,則動態庫具有佔用更少磁碟空間的優勢。此外,它們允許庫更新(錯誤修復),而無需重建可執行檔案。
      例如,foo.so foo.dylib foo.dll