本文均來自狄泰軟件學院
鏈接器的主要作用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確的銜接
靜態鏈接
由鏈接器在鏈接時將庫的內容直接加入到可執行程序中
Linux下靜態庫的創建和使用
編譯靜態庫源碼:gcc -c lib.c -o lib.o
生成靜態庫文件:ar -q lib.a lib.o
使用靜態庫編譯:gcc main.c lib.a -o main.out
動態鏈接
可執行程序在運行時才動態加載庫進行鏈接
庫的內容不會進入可執行程序當中
Linux下動態庫的創建和使用
編譯動態庫源碼:gcc -shared dlib.c -o dlib.so
使用動態庫編譯:gcc main.c -ldl -o main.out
關鍵系統調用
dlopen:打開動態庫文件
dlsym:查找動態庫中的函數並返回調用地址
dlclose:關閉動態庫文件
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);
}
鏈接是指將目標文件最終鏈接爲可執行程序
根據鏈接方式的不同,鏈接過程可以分爲:
靜態鏈接:目標文件直接鏈接進入可執行程序
動態鏈接:在程序啓動後才動態加載目標文件