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