『壹』 為什麼gcc的編譯時搜索動態庫路徑(-l)和執行時搜索動態庫
動態鏈接庫在編譯時與執行時的路徑搜索機制,體現了編程語言設計上的差異與挑戰。動態鏈接庫的code不直接嵌入執行文件中,而是在鏈接時動態載入所需的庫。執行文件僅保留鏈接信息,指示哪些.so文件需要載入。
編譯過程記錄了這些鏈接信息,確保執行文件能在不同環境下運行。然而,這些機器的庫安裝路徑可能與編譯環境不同,如Ubuntu與CentOS系統,這就需要生產環境的機器自行配置庫路徑。
這種分離機制雖然保證了靈活性,但也帶來了挑戰。不同環境下的庫路徑配置可能引發問題,增加部署復雜性。C和C++在動態鏈接庫管理上的局限性,促使開發者探索其他語言解決方案。例如,Java虛擬機(JVM)提供了"一次編譯,全球運行"的便利性,簡化了跨平台部署。
綜上所述,動態鏈接庫在編譯時與執行時的路徑搜索體現了跨平台編程的復雜性與多樣性。C和C++面臨的問題促使開發者尋求更優雅的解決方案,而JVM等其他語言通過優化設計,提供了更好的跨平台兼容性與部署體驗。
『貳』 C++動態鏈接庫(DLL)的創建和調用
一、理解庫
庫的使用能顯著提升編程效率,避免重復編寫已有的功能代碼,提高代碼的可讀性,且便於在不同項目中重復利用代碼。
二、動態庫與靜態庫
動態庫在運行時載入,而靜態庫則在編譯階段與目標文件打包,形成可執行文件的一部分。
靜態庫優點:可執行文件依賴項少,編譯階段完成鏈接,執行期間代碼裝載速度快,缺點:可執行文件變大,作為依賴庫時造成多餘副本,升級時需重新編譯。
動態庫優點:實現進程間資源共享,升級程序簡單,缺點:運行期間載入導致執行速度減慢,增加程序依賴項。
三、動態鏈接庫(DLL)創建步驟
在Visual Studio中創建新動態鏈接庫項目,完成頭文件(.h)和源文件(.cpp)的創建與編寫,使用__declspec屬性關鍵字指定符號的導入導出,並在.cpp文件中實現函數,生成解決方案後,即可得到動態庫文件。
四、動態鏈接庫(DLL)調用方法
調用動態庫有兩種方式,隱式載入和顯示載入。隱式載入需將動態庫與相關文件放置於特定目錄下,顯式載入則使用LoadLibrary()函數進行載入。
實現隱式載入:創建測試項目,將動態庫和相關文件拷貝至項目目錄,添加頭文件引用和依賴項,編寫調用代碼並查看結果。
至此,動態鏈接庫的創建與調用過程完成,大大提高了開發效率與代碼復用性。
『叄』 dll庫和lib庫有什麼區別
關於dll庫和lib庫的區別如下:
1、使用場景不同:lib是編譯時用到的,dll是運行時用到的。
如果要完成源代碼的編譯,只需要 lib;如果要使動態鏈接的程序運行起來,只需要dll。
2、用途不同:如果有dll文件,那麼lib一般是一些索引信息,記錄了dll中函數的入口和位 置,dll中是函數的具體內容;如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。
使用靜態編譯的lib文件,在運行程序時 不需要再掛動態庫,缺點是導致應用程序比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程序才可以。
3、應用對象不同:動態鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到DLL 文件。
在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。
DLL和LIB文件必須隨應用程序 一起發行,否則應用程序會產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。
(3)動態鏈接編譯為什麼需要庫文件擴展閱讀:
dll庫和lib庫使用方法:
1、使用lib的方法:
靜態lib中,一個lib文件實際上是任意個obj文件的集合,obj文件是cpp文件編譯生成的。在編譯這種靜態庫工程時,不會遇到鏈接錯誤;即使有錯,也只會在使用這個lib的EXT文件或者DLL工程里暴露出來。
在VC中新建一個static library類型的工程Lib,加入test.cpp文件和test.h文件(頭文件內包括函數聲明),然後編譯,就生成了Lib.lib文件。
2、使用dll的方法:
使用動態鏈接中的lib,不是obj文件的集合,即裡面不會有實際的實現,它只是提供動態鏈接到DLL所需要的信息,這種lib可以在編譯一個DLL工程時由編譯器生成。
參考資料來源:網路—lib
參考資料來源:網路—dll
『肆』 動態編譯和靜態編譯有何主要區別
靜態編譯與動態編譯的區別
1、動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。
2、靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴於動態鏈接庫。所以其優缺點與動態編譯的可執行文件正好互補。