大家都知道,在windows系統中有很多的動態鏈結庫(以.dll為字尾的檔案,dll即dynamic link library)。這種動態鏈結庫,和靜態函式庫不同,它裡面的函式並不是執行程式本身的一部分,而是根據執行程式需要按需裝入,同時其執行**可在多個執行程式間共享,節省了空間,提高了效率,具備很高的靈活性,得到越來越多程式設計師和使用者的青睞。那麼,在linux系統中有無這樣的函式庫呢? 答案是肯定的,linux的動態鏈結庫不僅有,而且為數不少。在/lib目錄下,就有許多以.so作字尾的檔案,這就是linux系統應用的動態鏈結庫,只不過與windows叫法不同,它叫so,即shared object,共享物件。
生成動態鏈結庫: 如:
gcc -fpic -shared -o example.so example1.c example2.c
-fpic 使輸出的物件模組是按照可重定位位址方式生成的。
-shared指定把對應的原始檔生成對應的動態鏈結庫檔案libstr.so檔案。
linux下使用動態鏈結庫,源程式需要包含dlfcn.h標頭檔案,此檔案定義了呼叫動態鏈結庫的函式的原型。下面詳細說明一下這些函式。
3.1.1 dlerror
原型:const
char*dlerror(void);
作用:當動態鏈結庫操作函式執行失敗時,dlerror可以返回出錯資訊,返回值為null時表示操作函式執行成功。
3.1.2 dlopen
原型:void*dlopen (const
char*filename,intflag);
作用: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值,否則返回的是操作控制代碼。
3.1.3 dlsym
原型:void*dlsym(void*handle,char*symbol);
作用:dlsym根據動態鏈結庫操作控制代碼(handle)與符號(symbol),返回符號對應的函式的執行**位址。由此位址,可以帶引數執行相應的函式。
舉例:voidhandle =null;
void(*add)(intx,inty);
handle =dlopen("***.so"
,rtld_lazy);
if(!handler)
add=dlsym(handle,"add"
);
if(add)
add(89,369);
dlclose(handle);
3.1.4 dlclose
原型:intdlclose (void*handle);
作用:dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真正被系統解除安裝。
**:
Linux 動態鏈結庫 so 的使用
1.背景 庫 就是已經編寫好的,後續可以直接使用的 c 靜態庫 會合入到最終生成的程式,使得結果檔案比較大。優點是不再有任何依賴。c 動態庫 動態庫,乙個檔案可以多個 同時使用記憶體中只有乙份,節省記憶體,可以隨主 一起編譯。缺點是需要標頭檔案。說 庫就是除了main函式之外的其他 都可以組成庫。2...
linux下檢視動態鏈結庫so檔案的依賴的相關組建
我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支援程式的...
linux下檢視動態鏈結庫so檔案的依賴的相關元件
我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支援程式的...