1. 程式人生 > >linux下封裝函式庫——動態庫.so和靜態庫.a(程式碼實現及連結方式)

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命令可以檢視程式依賴的庫資訊: 這裡寫圖片描述 從中可以找到我們進行連結的靜態庫資訊。

大家共同進步 這裡寫圖片描述