1. 程式人生 > >Linux下,手動載入動態庫~~

Linux下,手動載入動態庫~~

咳咳,在自己寫的函式中載入一個動態庫。

----標頭檔案 #include<dlfcn.h>

有四位夥計: dlopen(),

                   dlsym(),

                   dlclose(),

                   dlerror().

接下來一一登場!

在編譯時要加入 -ldl  : 如: gcc test.c -o test -ldl

1, dlopen() 使用指定模式,開啟指定的動態連結庫檔案,並返回一個控制代碼給呼叫程序,失敗的話返回NULL。

函式原型:

              void * dlopen(const char* pathname, int mode);

              pathname:  指定庫的路徑和名字。

              mode: 開啟模式。有以下幾種:

       a.解析方式:

             RTLD_LAZY    暫緩決定,等有需要時再解出符號。

             RTLD_NOW    立即決定,返回前解除所有為決定的符號。

       b.作用範圍,可與解析方式通過"|"組合使用

             RTLD_LOCAL      動態庫中定義的符號不能被其後開啟的其他庫重定位,預設為此。

             RTLD_GLOBAL    動態庫中定義的符號可被其後開啟的其他庫重定位。

詳細的英文解釋:

           http://www.9linux.com/dlsym.html

2, dlsym()呼叫使用dlopen()開啟的庫中的函式的地址。


函式原型:

               void* dlsym(void* handle,const char* symbol);

               handle是由dlopen開啟動態連結庫後返回的指標,symbol就是要求獲取的函式名稱,

返回值是void*,指向函式的地址,共呼叫使用。

3,dlclose() 關閉指定控制代碼的動態連線庫,只有當詞是動態連結庫的使用計數為0時,才會真正被系統解除安裝。

函式原型:

              int dlclose(void* handle);

4,dlerror()當動態連結庫操作函式執行失敗時,dlerror可以返回出錯資訊,返回值為NULL時表示操作函式執行成功。

函式原型:

              const char* dlerror(void);

一個例子: