編譯鏈接
參考網(wǎng)址
預處理,編譯,匯編,鏈接
預處理 處理#指令
預處理主要是處理源代碼中以#開頭的指令(#pragma 除外),例如#include,預處理之后會將stdio.h的內(nèi)容插入到預處理指令的位置。
想要只生成預處理之后的內(nèi)容,可以使用下面的方式:
gcc -E -o helloWorld.i helloWorld.c #-E參數(shù)表示只進行預處理
生成的helloWorld.i即為預處理之后的內(nèi)容
編譯 C語言->匯編語言
預處理之后就需要對生成的預處理文件進行詞法分析,語法分析,語義分析,最終產(chǎn)生匯編代碼文件,說白點可以簡單理解為將C代碼“翻譯”成匯編代碼。該過程是核心同時也是較復雜的一個過程。
gcc -S -o helloWorld.s helloWorld.c #-S參數(shù)表示只到生成匯編為止
匯編 匯編語言->機器碼
匯編是將匯編代碼翻譯成機器可執(zhí)行的指令,生成目標文件。整個過程較為簡單,幾乎只是按照匯編指令和機器指令進行一一翻譯。
鏈接
鏈接是以某種方式將各個目標文件整個在一起,生成最后的可執(zhí)行文件。我們的hello程序中調(diào)用了printf函數(shù),但是并不存在于helloWorld.o中,而是存在于libc.so或libc.a中。
通過ldd命令看到helloWorld程序鏈接了系統(tǒng)的庫
linux下制作靜態(tài)庫
動態(tài)庫的制作與兩種使用方式
在執(zhí)行 make 命令編譯程序時,常見的輸出信息包括 CC、LD 和 AR,它們分別表示以下含義:
-
CC (Compiler):表示編譯器,在編譯源代碼文件時使用。通常情況下,
CC是指 C 語言的編譯器,如 GCC (GNU Compiler Collection)。對于 C++ 程序,可能會顯示CXX來表示 C++ 編譯器。 -
LD (Linker):表示鏈接器,在編譯和鏈接階段將編譯后的目標文件連接成可執(zhí)行文件或庫文件時使用。鏈接器會將多個目標文件合并成一個可執(zhí)行文件或庫文件,并解決函數(shù)調(diào)用和符號引用等問題。
-
AR (Archiver):表示靜態(tài)庫生成器,用于創(chuàng)建靜態(tài)庫文件。靜態(tài)庫是一組預編譯的目標文件的集合,通過
ar命令創(chuàng)建并管理靜態(tài)庫文件。通常在編譯過程中會使用AR來創(chuàng)建和管理靜態(tài)庫文件。
這些信息在 make 過程中顯示出來,有助于了解編譯、鏈接和庫生成等階段所使用的工具和操作。正常情況下,這些輸出信息表示編譯過程正常進行,并且顯示了使用的工具和階段的進度。
? CC when compiling a core part of the kernel
? CC [M] when compiling a module
? LD when linking

浙公網(wǎng)安備 33010602011771號