我正在使用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类型的模块。“
这里出了什么问题?
提前感谢您的任何答案!
答案 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.dll
和kernel32.dll
。 Dependency Walker尝试根据LoadLibrary
函数的查找规则查找它们。它在system32
目录中找到它们,但在32位系统上它们是32位。
答案 2 :(得分:0)
使用64位版本的Dependency Walker打开您的64位版本的dll' s。您将不再看到错误消息,"错误:找到了具有不同CPU类型的模块",如果您的模块已针对x64进行了正确编译。