如何生成靜態庫和動態庫

2021-04-17 00:03:04 字數 822 閱讀 6144

對於乙個編譯型語言,編譯器工作時總要經過預處理、編譯、鏈結等幾個過程。以 c/c++ 為例:預處理器(cpp)將每個 .c/.cpp 檔案中 #include 的標頭檔案都合併到 .c/.cpp 檔案中,並且對其進行巨集擴充套件,由此生成數個編譯單元。一般來說每個 .c/.cpp 檔案對應乙個編譯單元。隨後,編譯器(cc)將每個編譯單元翻譯成本地二進位制**,在 gnu/linux 中字尾是 .o,在 ms vc 中字尾 .obj。這種二進位制**又被稱為 object 檔案,和最終的目標檔案一樣也有 code, data, heap, statck 等資料段,但卻不可以被執行(缺少入口點)。鏈結器(ld)將多個 object 檔案在目標檔案中重新定位,也就是 relocate 的過程,再加入額外的一些**(其他的鏈結檔案),最終生成目標檔案。目標檔案可以是可執行檔案,靜態鏈結檔案,或者動態鏈結檔案。

1.在 gnu/linux 系統中靜態鏈結檔案實際上就是多個 .o 檔案的壓縮包。假設我們有 cool.h cool.c 和 some.c 檔案,要得到靜態鏈結庫 libcool.a。首先使用如下指令得到相應的 object 檔案 cool.o 和 some.o:

gcc -c cool.c

gcc -c some.c

用這種方法生成的 object 檔案稱為 pdc 即位置相關**(position-dependence code)。再使用如下指令可以得到靜態鏈結檔案 libcool.a:

ar -r libcool.a cool.o some.o

ranlib libcool.a

靜態鏈結庫 libcool.a 遵從 gnu/linux 規定的靜態鏈結庫命名規範,必須是"libyour_library_name.a"

如何生成靜態庫和動態庫

對於乙個編譯型語言,編譯器工作時總要經過預處理 編譯 鏈結等幾個過程。以 c c 為例 預處理器 cpp 將每個 c cpp 檔案中 include 的標頭檔案都合併到 c cpp 檔案中,並且對其進行巨集擴充套件,由此生成數個編譯單元。一般來說每個 c cpp 檔案對應乙個編譯單元。隨後,編譯器 ...

Linux 如何生成靜態庫和動態庫

1 linux下的庫 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同。靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此 體積較小。2 庫存在的意義 庫是別人寫好的現有的,成熟的,可以復用的 你可以使用但...

Linux 如何生成靜態庫和動態庫

1 linux下的庫 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同。靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此 體積較小。2 庫存在的意義 庫是別人寫好的現有的,成熟的,可以復用的 你可以使用但...