http://www.cnblogs.com/Xiao_bird/archive/2010/03/01/1675821.html
Linux下的靜態鏈接庫,做起來比較容易,只要將目標文件用ar打包就可以,下面寫一下動態鏈接庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請大家指正。
動態鏈接庫的生成:
代碼上與寫靜態鏈接庫沒什麼區別,主要是在編譯時,以兩個文件舉例:
void Print();
/*mylib.c*/
#include <stdio.h>
#include "mylib.h"
void Print()
{
printf("This is in mylib\n");
}
編譯方法如下:
gcc -fpic -shared mylib.c -o mylib.so
此時將生成mylib.so動態鏈接庫文件。
動態鏈接庫在使用時,分爲“隱式調用”和“顯式調用”兩種,如果是隱式調用,則與靜態庫的使用方法差不多,注意需要包含導出函數的頭文件,即mylib.h:
#include "mylib.h"
int main()
{
Print();
}
編譯方法:
gcc -o main main.c -L./ mylib.so
注意要加上動態鏈接庫的搜索路徑,否則編譯器只會到系統路徑中去尋找。
顯式調用的方式,不必包含mylib.h,但是需要增加幾個系統調用:
#include <dlfcn.h> // 顯式加載需要用到的頭文件
int main()
{
void *pdlHandle = dlopen("./mylib.so", RTLD_LAZY); // RTLD_LAZY 延遲加載
char *pszErr = dlerror();
if( !pdlHandle || pszErr )
{
printf("Load mylib failed!\n")
return 1;
}
void (*Print)() = dlsym(pdlHandle, "Print"); // 定位動態鏈接庫中的函數
if( !Print )
{
pszErr = dlerror();
printf("Find symbol failed!%s\n", pszErr);
dlclose(pdlHandle);
return 1;
}
Print(); // 調用動態鏈接庫中的函數
dlclose(pdlHandle); // 系統動態鏈接庫引用數減1
return 0;
}
可以看到,顯式調用的代碼看上去要複雜很多,但是卻比隱式調用要靈活,我們不必在編譯時就確定要加載哪個動態鏈接庫,可以在運行時再確定,甚至重新加載。
看一下顯式調用的編譯方式:
gcc -ldl -o main main.c
注意要添加-ldl選項,以使用顯式調用相關的函數調用。