簡體   English   中英

在 MS VC 2013 Express 中將 C++ dll 從 32 位轉換為 64 位

[英]Convert C++ dll from 32bit to 64bit in MS VC 2013 Express

我的代碼可以在 32 位和 64 位配置下編譯,但只有第一個運行良好。 我用depends.exe打開了庫,在64位的情況下,我看到兩條錯誤消息:

錯誤:由於隱式依賴模塊中缺少導出函數,至少有一個模塊具有未解析的導入。 錯誤:找到具有不同 CPU 類型的模塊。

在depends.exe 的模塊列表中,我看到我的dll 的CPU 類型是x64,但其他一切都是x86(其他一切都應該是動態鏈接的)。 在動態鏈接的情況下,如何告訴 VC 使用 64 位庫?

編譯和鏈接期間沒有警告或錯誤消息。

考慮到配置,我根據 MS 的建議配置了我的解決方案,我認為這沒有任何問題。 我只能考慮缺少宏或錯誤的庫依賴項,或者可能是 VC 選項。

編輯: 非常接近我的問題。

EDIT2:如果是 lib,我也會收到錯誤消息:錯誤:至少一個文件不是 32 位或 64 位 Windows 模塊。 並且沒有找到 DOS 或 PE 簽名。 此文件不是有效的 32 位或 64 位 Win 模塊。

來自 Dependency Viewer 的這類消息通常是一個紅鯡魚,一個誤報。 如果您將 32 位版本的 Dependency Walker 與 64 位模塊一起使用,它有時會錯誤地認為您的 DLL 鏈接到 32 位模塊。

您可以嘗試改用 64 位版本的 Dependency Walker,它應該可以更好地工作。 然而,Dependency Walker 正在做一個靜態分析,它並不總是產生與真正的模塊加載器相同的結果。 如果你想知道你的模塊是否可以加載,你需要讓加載器在一個正在運行的程序中加載它。 例如,通過創建鏈接到 DLL 的程序。

最簡單的方法是創建一個調用LoadLibrary來加載庫的簡單程序。 看看能不能成功。 如果不是,那么您可能會遇到依賴關系問題。 它們最好使用 Dependency Walker 的配置文件模式進行調試。 這會動態調試加載過程,而不是您一直在使用的容易出錯的靜態分析。

當然,您的 DLL 肯定有可能無法加載,因為加載器在解析依賴項時會提供 32 位 DLL。 如果是這種情況,那么 Dependency Viewer 的配置文件模式將揭示問題,然后您可以解決它。

關於您的問題編輯,.lib 文件不是 PE 模塊。 您不能將 .lib 文件傳遞​​給LoadLibrary ,也不能使用 Dependency Walker 檢查它。 可能會出現一些混淆是因為術語超載了。 .lib 文件是一個庫,可以是導入庫或靜態庫。 DLL 是一個庫,一個動態鏈接庫。 在我上面寫的內容中,我使用 library 來引用 DLL。

暫無
暫無

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

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