比方說,下面的架構:調用靜態庫的功能嵌入在DLL
- 靜態庫用於/一個DLL
- 的DLL由可執行文件加載(隱或顯式)內聯
是否有可能從可執行代碼訪問靜態庫的代碼而不顯式重新鏈接它,也不能在DLL中插入包裝函數? 換句話說,我正在尋找一種方法來創建依賴靜態庫代碼的dll導出。
比方說,下面的架構:調用靜態庫的功能嵌入在DLL
是否有可能從可執行代碼訪問靜態庫的代碼而不顯式重新鏈接它,也不能在DLL中插入包裝函數? 換句話說,我正在尋找一種方法來創建依賴靜態庫代碼的dll導出。
鑑於你的限制,答案是否定的。
原因是可執行文件沒有任何對DLL的依賴或「調用」的可見性。就可執行程序而言,他只知道DLL本身:在鏈接時,可執行文件只知道它從DLL中消耗的那些導出。他將針對DLL(如果所述DLL的依賴關係無法解析將失敗)調用LoadLibrary(),然後調用所述DLL的導出。
如果由於某種原因無法靜態鏈接到DLL所使用的庫,則另一種方法是將調用包裝到所述靜態庫中。這可能是一個很多電話的痛苦,但也有其他人創建的自動化工具來幫助。特別是我用這個之前創建一個DLL的包裝,其出口數以百計的功能時,我想截取特定的一個:http://www.codeproject.com/KB/DLL/CreateYourProxyDLLs.aspx
答案可以很容易地:是的。
的唯一要求是:
在靜態LIB文件,你必須定義__declspec(dllexport)
所有要導出什麼。 當你將這個LIB文件包含到你的DLL項目中時,你聲明爲__declspec(dllexport)
的所有函數都將自動導出DLL,並且可以從你的Exe文件中訪問。
鏈接到靜態庫本身會出現什麼問題? – AAT
只是因爲DLL與靜態庫鏈接,並不意味着包含了整個靜態庫。 –