最近在做的專案中使用到動態庫的動態載入技術,windows和linux都提供了相應的函式來開啟動態庫、獲取函式指標和關閉動態庫
,在開啟動態庫函式(dlopen或loadlibrary)中指定動態庫的檔名後,在程式執行時是以什麼次序來搜尋動態庫呢?
linux下搜尋路徑的次序:
1) elf可執行檔案中動態段中dt_rpath所指定的路徑,不常用但是比較使用的方法;
2) 編譯目標**時指定的動態庫搜尋路徑(-wi,-rpath=./);
3) 環境變數ld_library_path指定的動態庫搜尋路徑;
4) 配置檔案/etc/ld.so.conf(或ld.so.cache)中指定的動態庫搜尋路徑;
5) 預設的動態庫搜尋路徑/lib;
6) 預設的動態庫搜尋路徑/usr/lib。
在上述1-3中指定的動態庫搜尋路徑都可以指定多個搜尋目錄,其先後順序是按指定路徑的先後順序搜尋的。如果動態庫之間存在依賴關係,那麼先載入那些被依賴的動態庫。
windows下搜尋路徑次序
1) 可執行檔案所在的目錄(當前目錄);
2) windows的系統目錄(該目錄可以通過getsystemdirectory函式獲得);
3) 16位的系統目錄(windows目錄下的system子目錄);
4) windows目錄(該目錄可以通過getwindowsdirectory函式獲得);
5) 程序當前所在的工作目錄;
6) path環境變數中所列出的目錄。
注:工作目錄位於windows目錄之後,這一改變開始於windows xp sp2之後。
linux 靜態庫和動態庫
1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...
Linux 靜態庫和動態庫
庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...
Linux 靜態庫和動態庫
我們指定c程式從 到乙個可執行程式需要經過預處理 編譯 彙編 鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的 體積較小,多個程式共同使用庫的 我們li...