大家都知道,在WINDOWS系統中有很多的動態鏈接庫(以.DLL為後綴的文件,DLL即Dynamic Link Library)。這種動態鏈接庫,和靜態函數庫不同,它裡面的函數並不是執行程序本身的一部分,而是根據執行程序需要按需裝入,同時其執行代碼可在多個執行程序間共享,節省了空間,提高了效率,具備很高的靈活性,得到越來越多程序員和用戶的青睐。那麼,在LINUX系統中有無這樣的函數庫呢? 答案是肯定的,LINUX的動態鏈接庫不僅有,而且為數不少。在/lib目錄下,就有許多以.so作後綴的文件,這就是LINUX系統應用的動態鏈接庫,只不過與WINDOWS叫法不同,它叫so,即Shared Object,共享對象。
生成動態鏈接庫:
如:
Linux下使用動態鏈接庫,源程序需要包含dlfcn.h頭文件,此文件定義了調用動態鏈接庫的函數的原型。下面詳細說明一下這些函數。
原型:
當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。
原型:
dlopen用於打開指定名字(filename)的動態鏈接庫,並返回操作句柄。
參數說明:
filename: so文件名.如果名字不以/開頭,則非絕對路徑名,將按下列先後順序查找該文件。
(1) 用戶環境變量中的LD_LIBRARY值;
(2) 動態鏈接緩沖文件/etc/ld.so.cache
(3) 目錄/lib,/usr/lib.
flag:表示在什麼時候解決未定義的符號(調用)。取值有兩個:
1) RTLD_LAZY : 表明在動態鏈接庫的函數代碼執行時解決。
2) RTLD_NOW : 表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。
dlopen調用失敗時,將返回NULL值,否則返回的是操作句柄。
原型:
dlsym根據動態鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數的執行代碼地址。由此地址,可以帶參數執行相應的函數。
舉例:
原型:
dlclose用於關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。