動態庫和靜態庫的生成 linux c/c++

    對於一個編譯型語言,編譯器工作時總要經過預處理、編譯、鏈接等幾個過程。以 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"

2.在 GNU/Linux 中動態鏈接文件,必需通過鏈接器 ld 生成。假設我們有 hot.c other.c 等文件要生成動態鏈接庫 libhot.so 。首先使用如下指令得到相應的 object 文件 hot.o 和 some.o
    gcc -fPIC -c hot.c
    gcc -fPIC -c other.c
參數 -fPIC 指定生成的 object 文件爲位置無關代碼(position-independence code),只有 PIC 可以被用作生成動態鏈接庫。然後使用如下指令得到動態庫:   
    ld -Bshared -o libhot.so hot.o other.o
或者可以使用編譯器的ld wrapper:   
    gcc -shared -o libhot.so hot.o other.o也可以使用編譯器直接生成動態庫:
    gcc -fPIC -shared -o libhot.so hot.c other.c
這裏選項 -shared 指示目標文件的類型是動態鏈接庫,動態庫的命名規範是"libyour_library_name.so"


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章