1. 程式人生 > >關於如何在linux環境下生成a庫和so庫(改,附圖)

關於如何在linux環境下生成a庫和so庫(改,附圖)

一般linux環境下的連結庫分為a庫和so庫,分別表示靜態連結庫和動態連結庫,其作用是把C程式編譯好做成一種可執行連結檔案,c主程式檔案呼叫這些程式的函式介面是可以使用a庫或so庫,在主程式中只需要include含有庫中提供的函式介面宣告的標頭檔案即可。

一、生成a庫

首先,你需要寫幾個你要呼叫的函式的原始檔,如test1.c、test2.c等。其程式碼如下:

再將標頭檔案寫好(其實這裡的標頭檔案並不需要,若是編譯成庫的程式之間有呼叫關係的時候才用得到,只在呼叫連結庫的時候編寫標頭檔案即可)。開始編譯,將原始檔編譯成.o檔案。命令列指令如下:

然後開始生成a庫,指令如下:


注意:連結庫字首必須以lib開頭

得到libtest.a庫檔案後,然後將.a庫連結到主程式中,寫主程式main.c和標頭檔案main.h 。

載入a庫,生成可執行檔案並執行,指令如下:gcc main.c -L. -ltest -o test


可以看到,a庫連線成功,可以呼叫到裡面的函式。

二、生成so庫

利用上面所寫過的test1.c 和test2.c生成.so庫的指令如下:


同樣so庫的字首必須為lib,然後將.so庫連結到主程式main.c中,這裡需要注意一下,因為動態庫的特性,編譯器會到指定的目錄去尋找動態庫,目錄的地址在/etc/ld.so.conf.d/ 目錄裡的libc.conf檔案裡,你可以在裡面加一行地址表示你so庫的位置,更改完conf檔案裡的內容,記得輸入命令列:ldconfig。

你還可以將so庫複製到預設的目錄下。這裡是將so庫複製到了預設目錄下,生成可執行檔案並執行,指令如下:

gcc main.c -L. -ltest -o main


靜態連結庫和動態連結庫的區別在於,主程式在執行前,靜態連結庫的連結固定寫入在程式中,而動態連結庫則是在每次程式執行再載入連結。

在載入動態連結庫的時候,有可能會遇到載入不到的錯誤,原因在於系統預設載入的動態連結庫路徑裡沒有找到你的動態庫,有三種解決方法:

1.在執行gcc main.c -L. -ltest -o main 前,執行 export LD_LIBRARY_PATH=$(pwd)

2.將你so所在的目錄寫到/etc/ld.so.conf檔案裡,然後執行ldconfig。

3.將你的so放在/etc/ld.so.conf裡的路徑位置裡。