2011-02-16 117 views
0

我正在構建一個win32可執行文件。編譯器是MinGW的最新版本。庫依賴關係是GLUT和libpng。缺少zlib.dll

我首先在Windows 7機器上測試過,並且必須獲得libpng3.dll和freeglut32.dll。但是,在XP上,我必須(另外)獲取zlib1.dll。

XP機器是全新安裝的虛擬機,所以我懷疑新的win7機器可能也缺乏zlib1。

我的問題是如何去找出我需要分發哪些dll?我怎麼知道,先驗,我的程序需要哪些動態庫在特定系統上運行?我想這是安裝程序的用途......我猜測安裝程序所做的是通過系統查找哪些依賴性不滿意,然後提供它們。所以這樣,如果我要分發我的程序,我可以檢查用戶的機器是否已經有zlib1.dll,並且如果它已經在系統目錄中找到,我將不會安裝zlib1.dll。然而,我從來沒有找到特別對我說的文檔,「libpng需要zlib」,所以,直到我在缺乏zlib的機器上測試可執行文件時,我並不知道這種依賴關係。我怎樣才能創建我的依賴列表,而無需全新安裝每個操作系統的每個版本進行測試?

我的一個想法是反編譯可執行文件,或者通過某種方法檢查鏈接過程,找到所有在運行時鏈接的庫。現在問題變成找出哪些應該已經存在,以及哪些我可以預期在分配中提供。

編輯:好吧,我看了,我下載的libpng的安裝在它的bin目錄中提供了zlib1.dll。所以不包括它幾乎是我的錯。無論如何,丹尼爾的答案是確定的。

回答

1

Dependendy Walker顯示您的程序的所有代碼。

+0

這是完全真棒。謝謝。 – 2011-02-16 05:43:28

+0

幾乎每個涉及DLL的問題都有一個答案指向這個工具:)) – Daniel 2011-02-16 06:49:20

0

在我看來,這個問題的正確答案是從源頭開始,而不是使用Dependency Walker逆向工程解決方案,儘管它毫無疑問是真棒和有用的工具。

Dependency Walker的問題在於,它只會告訴你程序在哪個特定運行時需要在運行它的操作系統上運行。如果您的應用程序中有任何動態加載依賴關係,那麼只有確保您使用Dep對應用程序進行了分析,纔會選擇這些依賴項。沃克並強迫它通過這些動態負載。

我對這個問題的首選方法是從你自己的源代碼開始,分析和理解它依賴於什麼。這樣做通常很容易,因爲你知道它很好。

您需要了解什麼是您的編譯器的部署要求。您通常可以選擇靜態和動態鏈接到C++運行時。顯然,動態鏈接會導致部署需求。

您也可能鏈接到第三方代碼。一個例子是Windows組件。這些通常不需要部署,您可以將它們作爲已經存在的地方。有時候這是不正確的,例如在Windows 2000上使用GDI +。

有時您會靜態鏈接到第三方代碼(也很容易),但是如果您動態鏈接,則意味着部署要求。