1. 程式人生 > >C語言使用動態連結庫靜態連結庫

C語言使用動態連結庫靜態連結庫

1.C語言中的連結器

1)每個 C 語言原始檔被編譯後生成目標檔案,這些目標檔案最終要被連結在一起生成可執行檔案。 

2)連結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確的銜接。 

2.靜態連結

由連結器在連結時將庫的內容直接加入到可執行程式中

編譯靜態庫原始碼:gcc –c lib.c –o lib.o

生成靜態庫檔案:ar –q lib.a lib.o //lib.o 與其他檔案打包到 lib.a

使用靜態庫編譯:gcc main.c lib.a –o main.out

3.動態連結

可執行程式在執行時才動態載入庫進行連結 ,庫的內容不會進入可執行程式當中


編譯動態庫原始碼:gcc –shared dlib.c –o dlib.so

使用動態庫編譯:gcc main.c -ldl –o main.out

4.dlopen、dlsym、dlclose使用動態庫

為了使程式方便擴充套件,具備通用性,可以採用外掛形式。採用非同步事件驅動模型,保證主程式邏輯不變,將各個業務已動態連結庫的形式載入進來,這就是所謂的外掛。linux提供了載入和處理動態連結庫的系統呼叫,非常方便。 

開啟動態庫:dlopen

查詢動態庫中的函式並返回呼叫地址:dlsym 

關閉動態庫:dlclose

dlib.c 庫 

複製程式碼
char* name()
{
    
return "Dynamic Lib"; } int add(int a, int b) { return a + b; }
複製程式碼

test.c

複製程式碼
#include <stdio.h>
#include <dlfcn.h> int main() { //開啟(載入)動態庫 void* pdlib = dlopen("./dlib.so", RTLD_LAZY); char* (*pname)(); int (*padd)(int, int); if( pdlib != NULL ) { //查詢函式地址
pname = dlsym(pdlib, "name"); padd = dlsym(pdlib, "add"); if( (pname != NULL) && (padd != NULL) ) { printf("Name: %s\n", pname()); printf("Result: %d\n", padd(2, 3)); } //關閉動態庫 dlclose(pdlib); } else { printf("Cannot open lib ...\n"); } return 0; } 複製程式碼

gcc -shared dlib.c -o dlib.so

gcc test.c -o test.o -ldl

參考資料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html