2017-07-17 124 views
0

因爲我的項目非常龐大,所以在調試時我手動禁用了Visual Studio中所有模塊的加載,然後啓用只有這些DLL必須在其中進行調試。這按預期工作。如何找出依賴於LIB文件的DLL列表?

但由於Visual Studio中的模塊列表不包含LIB文件,因此如何調試特定靜態庫中的代碼?

是否有選項可以查看鏈接到庫文件的DLL列表(.lib)

+0

既然你有'static-libraries'標籤,我假設你只是通過將它們叫做'.lib'(而不是DLL導入庫)來表示這些標籤。靜態庫在運行時不加載,但在鏈接時合併。所以,就目前來看,你的問題沒有道理。 –

+0

那麼你如何調試一個靜態lib代碼?我發現當啓用「加載所有模塊的符號」時,可以調試一個static-lib!我想通過加載最少數量的DLL的符號來調試靜態庫。那可能嗎?如果是的話,該怎麼做? –

+3

'有沒有選項可以查看鏈接到庫文件(.lib)的DLL列表?靜態庫沒有可能列出的依賴關係。依賴關係(讀取「未解析的外部符號」)在鏈接時解析,然後可以來自其他靜態庫或DLL,或簡單的'.obj'文件或「主要可執行文件」本身。 –

回答

1

靜態庫不與任何東西鏈接。它只是一個 目標文件包,您可以從鏈接器中選擇需要在程序中定義外部符號的 。 它從靜態庫 中提取它需要的目標文件並將它們嵌入到程序中。

因此,假設abc.lib包含目標文件a.obj,b.obj,c.obj。您通過鏈接main.objabc.lib來構建程序progmain.obj需要在a.obj中定義的內容加上c.obj中定義的內容,但在b.obj中沒有定義。然後prog完全相同,如果您根本連接了三個目標文件main.obj,a.obj,c.obj而根本沒有提到abc.lib

現在a.objc.obj可能會調用一個或多個DLLs在外部定義的函數 。也許main.obj調用在相同或其他DLL中定義的外部 函數。 prog將不得不與 這些DLL鏈接 - 不多也不少。 main.obj + a.obj + c.obj的DLL依賴關係是您的prog的DLL依賴關係,反之亦然。 沒有任何隱藏鏈接abc.lib而不是a.objc.obj隱藏。

+0

通過加載只有'prog.exe'的符號而獲得成功,因此它幫助我在調試時保持visual studio應用程序更輕。通過這種方式,我避免了加載所有其他需要大量時間的DLL。 :) –

0

我會做的測試,是使用靜態庫創建一個虛擬dll,然後用依賴關係walker(或vs連接過程)來查看dll,並找到鏈接的dll。