linux下封裝函式庫——動態庫.so和靜態庫.a(程式碼實現及連結方式)
在linux環境下的連結庫分為靜態連結庫(.a庫)和動態連結庫(.so庫),其作用是把C程式編譯好做成一種可執行連結檔案,主程式檔案呼叫這些程式的函式介面是可以使用a庫或so庫,在主程式中只需要include含有庫中提供的函式介面宣告的標頭檔案即可。所以學會如何將自己的原始碼封裝成庫進行使用很重要,接下來就來介紹一下然後進行庫的封裝: 1、動態連結庫的製作: 首先,生成一個簡單的函式實現mymax(a,b),將它封裝成庫來進行舉例: 程式碼如下:
1 int mymax(int a, int b)
2 {
3 if(a > b)
4 return a;
5 return b;
6 }
這裡可以通過gcc命令才生成.so庫,也可以編寫Makefile生成so庫,Makefile如下:
1 CC = gcc
2 SRCS = mymax.c
3 OBJS = $(SRCS:.c=.o)
4 EXEC = libmymax.so//這裡要注意生成的庫檔案開頭必須lib開頭,字尾.so
5 start:$(OBJS)
6 $(CC) -o $(EXEC) $(OBJS) -shared//這表明是一個動態庫
7 .c.o:
8 $(CC) -o [email protected] -c $< -fPIC//表示編譯函式時沒有偏移地址
9 clean:
10 rm -rf $(OBJS)
當然也可以直接使用指令:
這裡一定要注意so庫的字首必須為lib,然後將.so庫連結到主程式main.c中,這裡需要注意一下,因為動態庫的特性,編譯器會到指定的目錄去尋找動態庫,目錄的地址在/etc/ld.so.conf.d/ 目錄裡的libc.conf檔案裡,你可以在裡面加一行地址表示你so庫的位置,更改完conf檔案裡的內容,記得輸入命令列:ldconfig。 你還可以將so庫複製到預設的目錄下。這裡是將so庫複製到了預設目錄下,生成可執行檔案並執行,最後進行編譯連結使用Makefile如下:
1 CC = gcc
2 SRCS = mylib.c
3 OBJS = $(SRCS:.c=.o)
4 EXEC = myapp
5 start:$(OBJS)
6 $(CC) -o $(EXEC) $(OBJS) -L. -lmymax
7 .c.o:
8 $(CC) -o [email protected] -c $<
9 clean:
10 rm -rf $(OBJS)
這樣就生成了可執行程式myapp, 注意:在載入動態連結庫的時候,有可能會遇到載入不到的錯誤,原因在於系 統預設載入的動態連結庫路徑裡沒有找到你的動態庫,有三種解決方法: 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裡的路徑位置裡。
最後可以通過指令ldd檢視執行程式的連結庫都有哪些:
靜態連結庫和動態連結庫的區別在於,主程式在執行前,靜態連結庫的連結固定寫入在程式中,而動態連結庫則是在每次程式執行再載入連結。 接下來製作靜態連結庫: 最後使用nm命令可以檢視程式依賴的庫資訊: 從中可以找到我們進行連結的靜態庫資訊。
大家共同進步