簡體   English   中英

Windows:構建同一DLL的32位和64位版本

[英]Windows: Building both 32-bit and 64-bit versions of the same DLL

作為新合同職位培訓的一部分,我的任務是建立兩個DLL和兩個cppunit單元測試程序。 一切都成功構建。

當我嘗試運行一個單元測試程序時,我發現兩個DLL(由單元測試程序使用)都混合了32位和64位元素。 我下載了Dependency Walker(Depends.exe),並跟蹤DLL獲取其輸入的問題。 32位庫位於C:\\ AppName \\ bin目錄中,而64位庫位於C:\\ AppName \\ bin64中。

由於直到運行時(實際上是加載時間)才會加載DLLS,並且由於DLL與.exe不在同一目錄中,並且由於PATH將這兩個文件夾的搜索順序顯示為“ C:\\ AppName \\ bin64; C”,因此:\\ AppName \\ bin;“,當我嘗試運行單元測試時,出現一個錯誤,告訴我有64位模塊與32位模塊混合在一起,並拒絕運行。 我通過將bin64重命名為SAVE_bin64來解決此問題,以便加載程序將找不到它,默認為其他目錄,並加載正確的DLL。

我的辦公室伴侶也接受了同樣的任務。 他沒有這樣的困難。 不僅如此,而且我以前已經使程序成功運行,但是在使用公司安裝工具安裝了某些模塊后遇到了問題。 由於安裝是在后台進行的,所以我不知道它做了什么,除了愚弄我的構建之外。

Visual Studio C ++(非托管)生成過程中的某些內容已將足夠的信息包含到.exe中,以使加載程序知道在哪里可以找到正確的DLL,但是在執行安裝時卻大失所望。

在最終通過在Depends.exe中打開“完整路徑”來找出原因之前,我對此問題進行了廣泛的研究,因此我已經了解了SxS(並排)和DLL重定向,在此兩者都不相關。

因此,問題是,Windows加載程序如何一次找到了正確的DLL,而又沒有找到? 加載程序如何在他的計算機上找到正確的DLL,但不是我的?

提前致謝。

編輯添加:

我又嘗試了一個實驗。 我的bin64仍重命名為SAVE_bin64,我將兩個庫(libB.dll依賴於libA.dll)和單元測試程序(都依賴於libB.dll)構建為32位。 然后,我將SAVE_bin64重命名為bin64,這樣,如果加載程序完全依賴PATH變量來定位依賴的DLL,則由於32/64位不匹配,單元測試程序將無法運行。 但是,運行了單元測試程序,成功地在72個模塊中發現了一個錯誤。

這說明Visual Studio 2010 C ++編譯器/鏈接器能夠以某種方式將相關DLL的正確位置嵌入到可執行程序中,從而使加載程序不必依賴PATH變量來查找DLL。

這可能有助於理解Windows如何搜索dll:
MSDN:動態鏈接庫搜索順序

加載程序將選擇其名稱匹配的第一個(在搜索列表中)它首先看到的dll。 DLL是64位還是32位都沒有關系。 我可以肯定的是,如果它是一個重命名為.dll的文本文件,它甚至會嘗試加載它。也許您的同事在系統文件夾中擁有他的dll,或者與應用程序版本並列。

我發現一種簡單的處理方法是為32位和64位的dll使用不同的名稱。 example32.dll和example64.dll。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM