因爲我的項目非常龐大,所以在調試時我手動禁用了Visual Studio中所有模塊的加載,然後啓用只有這些DLL必須在其中進行調試。這按預期工作。如何找出依賴於LIB文件的DLL列表?
但由於Visual Studio中的模塊列表不包含LIB文件,因此如何調試特定靜態庫中的代碼?
是否有選項可以查看鏈接到庫文件的DLL列表(.lib)?
因爲我的項目非常龐大,所以在調試時我手動禁用了Visual Studio中所有模塊的加載,然後啓用只有這些DLL必須在其中進行調試。這按預期工作。如何找出依賴於LIB文件的DLL列表?
但由於Visual Studio中的模塊列表不包含LIB文件,因此如何調試特定靜態庫中的代碼?
是否有選項可以查看鏈接到庫文件的DLL列表(.lib)?
靜態庫不與任何東西鏈接。它只是一個 目標文件包,您可以從鏈接器中選擇需要在程序中定義外部符號的 。 它從靜態庫 中提取它需要的目標文件並將它們嵌入到程序中。
因此,假設abc.lib
包含目標文件a.obj
,b.obj
,c.obj
。您通過鏈接main.obj
和abc.lib
來構建程序prog
。 main.obj
需要在a.obj
中定義的內容加上c.obj
中定義的內容,但在b.obj
中沒有定義。然後prog
完全相同,如果您根本連接了三個目標文件main.obj
,a.obj
,c.obj
而根本沒有提到abc.lib
。
現在a.obj
或c.obj
可能會調用一個或多個DLLs在外部定義的函數 。也許main.obj
調用在相同或其他DLL中定義的外部 函數。 prog
將不得不與 這些DLL鏈接 - 不多也不少。 main.obj
+ a.obj
+ c.obj
的DLL依賴關係是您的prog
的DLL依賴關係,反之亦然。 沒有任何隱藏鏈接abc.lib
而不是a.obj
和c.obj
隱藏。
通過加載只有'prog.exe'的符號而獲得成功,因此它幫助我在調試時保持visual studio應用程序更輕。通過這種方式,我避免了加載所有其他需要大量時間的DLL。 :) –
我會做的測試,是使用靜態庫創建一個虛擬dll,然後用依賴關係walker(或vs連接過程)來查看dll,並找到鏈接的dll。
既然你有'static-libraries'標籤,我假設你只是通過將它們叫做'.lib'(而不是DLL導入庫)來表示這些標籤。靜態庫在運行時不加載,但在鏈接時合併。所以,就目前來看,你的問題沒有道理。 –
那麼你如何調試一個靜態lib代碼?我發現當啓用「加載所有模塊的符號」時,可以調試一個static-lib!我想通過加載最少數量的DLL的符號來調試靜態庫。那可能嗎?如果是的話,該怎麼做? –
'有沒有選項可以查看鏈接到庫文件(.lib)的DLL列表?靜態庫沒有可能列出的依賴關係。依賴關係(讀取「未解析的外部符號」)在鏈接時解析,然後可以來自其他靜態庫或DLL,或簡單的'.obj'文件或「主要可執行文件」本身。 –