![](/img/trans.png)
[英]Compiling x64 dll from x86 using Visual Studio 2008: unresolved external __imp_ symbols
[英]Compiling x64 dll from x86 using Visual Studio 2008
我正在使用Visual Studio 2008將一些外部C ++代碼編譯到dll中。代碼被包裝在外部“ C”中。
由於我正在交叉編譯,因此請在32位計算機上創建一個64位dll。 我將x64用作“配置管理器”中的“活動解決方案平台”。
我的dll編譯並成功鏈接。 但是,當我在Dependency Walker(depends.exe)中打開它時,我發現有些奇怪:我的dll被標記為64位。 但是,我的dll取決於32位的C:\\ windows \\ system32 \\ ntdll.dll和C:\\ windows \\ system32 \\ kernel32.dll! 結果,Dependency Walker給了我以下錯誤:“錯誤:由於隱式依賴模塊中缺少導出功能,至少一個模塊的導入無法解析。錯誤:找到了具有不同CPU類型的模塊。”
這是怎么了?
預先感謝您的任何回答!
Dependency Walker會給您該錯誤,因為32位系統上system32
的dll文件是32位。 如果您在64位版本的Windows上運行它,它將可以正常工作。
也許誤會來自於system32
的名稱? 它不一定包含32位文件-它包含與操作系統的位大小匹配的文件,因此在32位Windows sytem32
包含32位dll,在64位Windows system32
包含64位dll。
但是,它變得更加復雜-64位Windows可以運行32位進程,並且如果32位進程在64位版本的Windows上訪問system32,則將其重定向到SysWOW64
(是的system32
包含64位dll,而SysWOW64
包含32位dll)。
您的DLL取決於ntdll.dll
和kernel32.dll
。 Dependency Walker嘗試根據LoadLibrary
函數的查找規則找到它們。 它在system32
目錄中找到它們,但是在32位系統上,它們是32位。
使用Dependency Walker的64位版本打開DLL的64位版本。 如果您的模塊已針對x64正確編譯,您將不再看到錯誤消息“錯誤:找到了具有不同CPU類型的模塊”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.