首先設想一種情況,我們需要將某個功能做成可配置的,比如近期再弄的圖形系統,風格應該是可配置的:在配置檔案中用字串記錄使用到的「畫法」庫(這個「畫法」就比如windows裡面的開始按鈕,「windows經典」風格是乙個矩形,而「windows xp「風格則是乙個圓角矩形,它們使用的繪圖方法當然不一樣),改動配置檔案中「畫法」庫的路徑、名字,就可以實現風格的可配置~~而且,根據既定的介面,還可以自由新增新的風格,不需要重新編譯,只要把新寫好的函式編譯成庫,改動配置檔案中需要使用的庫的路徑和名字就ok了。
下面記下來這次實驗用到的東西~
需要用到的函式:
#include
void * dlopen(const char *
file
, int
mode);
void * dlsym(void *restrict
handle
, const char *restrict
name);
char * dlerror(void);
int dlclose(void *);
其中,
dlopen開啟file路徑下的共享庫檔案,返回這個共享庫的操作指標handle。mode可取值有2個:rtld_lazy和rtld_now, rtld_lazy就是第一次用到庫中的函式時才進行重定位,rtld_now就是馬上咯~
dlsym將dlopen返回的handle中的name函式載入,將返回值賦值給我們宣告的函式指標就是了~
dlerror返回這些過程中的錯誤資訊,字串~
dlclose,關閉已開啟的共享庫~
下面是個框架例子:
#include
#include
int main()
int (* my_function)(int);/* 宣告乙個函式指標,用來指向要載入的共享庫中的函式 */
char * error;/* 用來記錄錯誤資訊 */
void * handle;/* 這個指標指向開啟的庫 */
char * libfile;/* 要開啟的庫的路徑、檔名 */
init others
handle = dlopen(file, rtld_lazy);/* 開啟庫 */
if (!handle)
my_function = dlsym(handle, "function");/* 將庫中的function函式載入到my_function指標 */
if ((error = dlerror()) != null)
*my_function(2);/* 呼叫庫中的函式 */
dlclose(handle);/* 正常關閉庫 */
return 0;
這個框架中,假定開啟的庫中有乙個定義為【 int function(int) 】 的函式,我們宣告了乙個與之對應的函式指標,實現動態載入和呼叫。
靜態庫,共享庫,動態載入庫
一 靜態庫 1.概念 靜態庫就是一些目標檔案的集合,以.a結尾。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用 到函式的 從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。由於每個使用靜態庫的應用程式都需要拷貝所用函式的 所以靜態鏈結的檔案會比較大。2.建立與應用 首先建...
Linux下動態共享庫 連線和載入路徑
1.連線時找不到某乙個函式,出現 xx undefined 應該就是連線時找不到相應的動態庫,連線時動態庫的路徑如下 1 預設路徑是 lib,usr lib usr local lib 2 l 指定連線時動態庫的路徑 3 ld library path 指定連線路徑 2.執行應用程式時出現 erro...
Linux下動態共享庫 連線和載入路徑
1.連線時找不到某乙個函式,出現 xx undefined 應該就是連線時找不到相應的動態庫,連線時動態庫的路徑如下 1 預設路徑是 lib,usr lib usr local lib 2 l 指定連線時動態庫的路徑 3 ld library path 指定連線路徑 2.執行應用程式時出現 erro...