使用Visual Studio 2008从x86编译x64 dll

时间:2010-07-21 12:10:08

标签: c++ c visual-studio visual-studio-2008

我正在使用Visual Studio 2008将一些外部C ++代码编译到dll中。 代码包含在extern“C”中。

因为我正在交叉编译,所以在我的32位机器上创建一个64位的dll; 我在“配置管理器”中使用x64作为“活动解决方案平台”。

我的dll成功编译和链接。但是,当我在Dependency Walker(depends.exe)中打开它时,我注意到一些奇怪的事情: 我的dll标记为64位。我的dll依赖于C:\ windows \ system32 \ ntdll.dll和C:\ windows \ system32 \ kernel32.dll这些是32位! 结果Dependency Walker给了我以下错误: “错误:由于隐式依赖模块中缺少导出功能,至少有一个模块具有未解析的导入。 错误:找到了具有不同CPU类型的模块。“

这里出了什么问题?

提前感谢您的任何答案!

3 个答案:

答案 0 :(得分:2)

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(是{{ 1}}包含64位dll,system32包含32位dll。)

答案 1 :(得分:1)

您的DLL取决于ntdll.dllkernel32.dll。 Dependency Walker尝试根据LoadLibrary函数的查找规则查找它们。它在system32目录中找到它们,但在32位系统上它们是32位。

答案 2 :(得分:0)

使用64位版本的Dependency Walker打开您的64位版本的dll' s。您将不再看到错误消息,"错误:找到了具有不同CPU类型的模块",如果您的模块已针对x64进行了正确编译。