分類: 動態庫與靜態庫
2012-03-17 23:56
1710人閱讀收藏
舉報 linux
null
library
測試web服務
apache
10.動態庫的顯式呼叫
庫函式dlopen()將開啟乙個新庫,並把它裝入記憶體。該函式主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如apache web伺服器利用這個函式在執行過程中載入模組,這為它提供了額外的能力。乙個配置檔案控制了載入模組的過程。這種機制使得在系統中新增或者刪除乙個模組時,都不需要重新編譯了。
dlopen()在dlfcn.h中定義,並在dl庫中實現。它需要兩個引數:乙個檔名和乙個標誌。檔名可以是我們學習過的庫名字。標誌指明是否立刻計算庫的依賴性。如果設定為rtld_now的話,則立刻計算;如果設定的是rtld_lazy,則在需要的時候才計算。另外,可以指定rtld_global,它使得那些在以後才載入的庫可以獲得其中的符號。
當庫被裝入後,可以把 dlopen()返回的控制代碼作為給 dlsym()的第乙個引數,以獲得符號在庫中的位址。使用這個位址,就可以獲得庫中特定函式的指標,並且呼叫裝載庫中的相應函式。
下面詳細說明一下這些函式。
原型為:const char *dlerror(void);
當動態鏈結庫操作函式執行失敗時,dlerror可以返回出錯資訊,返回值為null時表示操作函式執行成功。
原型為:void *dlopen (const char *filename, int flag);
dlopen用於開啟指定名字(filename)的動態鏈結庫,並返回操作控制代碼。
filename:如果名字不以/開頭,則非絕對路徑名,將按下列先後順序查詢該檔案。
(1)使用者環境變數中的ld_library值;
(2)動態鏈結緩衝檔案/etc/ld.so.cache
(3)目錄/lib,/usr/lib
flag表示在什麼時候解決未定義的符號(呼叫)。取值有兩個:
1)rtld_lazy :表明在動態鏈結庫的函式**執行時解決。
2)rtld_now :表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。
dlopen呼叫失敗時,將返回null值,否則返回的是操作控制代碼。
取函式執行位址
原型為:void *dlsym(void *handle, char *symbol);
dlsym根據動態鏈結庫操作控制代碼(handle)與符號(symbol),返回符號對應的函式的執行**位址。由此位址,可以帶引數執行相應的函式。
如程式**:void (*add)(int x,int y); /*說明一下要呼叫的動態函式add*/
add=dlsym("***.so","add");/*開啟***.so共享庫,取add函式位址*/
add(89,369);/*帶兩個引數89和369呼叫add函式*/
原型為:int dlclose (void *handle);
dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真正被系統解除安裝。
編寫測試檔案
[html]view plain
copy
#include<
stdio.h
>
#include<
dlfcn.h
> //用於動態庫管理的系統標頭檔案
#include"test.h" //要把函式的標頭檔案包含進來,否則編譯時會報錯
intmain(int argc,char* argv)
char*pszerr = dlerror();
if(pszerr!= null)
//獲取函式的位址
ptest= dlsym(pdlhandle, "test");
pszerr= dlerror();
if(pszerr!= null)
//實現函式呼叫
(*ptest)();
//程式結束時關閉動態庫
dlclose(pdlhandle);
return0;
}
2、編譯測試檔案使用-ldl選項指明生成的物件模組需要使用共享庫
gcc -omain -ldl main.c
執行完後就生成了乙個main檔案
3、執行測試程式
執行 ./main
靜態庫與動態庫使用 顯示呼叫動態鏈結
1 案例 如何顯示的呼叫動態鏈結庫 1 建立專案test100 2 寫標頭檔案source.h 和原始檔 source.cpp source.h pragma once ifdef test exports define mipetaialgorithm api declspec dllexport...
除錯linux的動態庫(動態庫的建立 呼叫 除錯)
add是庫lib.c中的函式,生成liblib.so gcc lib.c shared g debug o liblib.so 編譯呼叫庫的程式,指定庫檔案使用當前路徑 給動態庫函式add設定斷點 gdb b add 在下面提示中輸入 y function add not defined.make ...
Linux環境下動態庫的呼叫
1 開啟動態鏈結庫 dlopen,函式原型為 void dlopen const char filename,int flag dlopen用於開啟指定名字 filename 的動態鏈結庫,並返回操作控制代碼。dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真...