Linux下動態鏈接庫的使用

http://www.cnblogs.com/Xiao_bird/archive/2010/03/01/1675821.html

Linux下的靜態鏈接庫,做起來比較容易,只要將目標文件用ar打包就可以,下面寫一下動態鏈接庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請大家指正。

動態鏈接庫的生成:

代碼上與寫靜態鏈接庫沒什麼區別,主要是在編譯時,以兩個文件舉例:

複製代碼
/*mylib.h*/
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 <stdio.h>
#include 
"mylib.h"

int main()
{
    Print();
}
複製代碼

編譯方法:

gcc -o main main.c -L./ mylib.so

注意要加上動態鏈接庫的搜索路徑,否則編譯器只會到系統路徑中去尋找。

顯式調用的方式,不必包含mylib.h,但是需要增加幾個系統調用:

複製代碼
#include <stdio.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選項,以使用顯式調用相關的函數調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章