在 MS VC 2013 Express 中将 C++ dll 从 32 位转换为 64 位

Posted

技术标签:

【中文标题】在 MS VC 2013 Express 中将 C++ dll 从 32 位转换为 64 位【英文标题】:Convert C++ dll from 32bit to 64bit in MS VC 2013 Express 【发布时间】:2014-09-09 08:16:01 【问题描述】:

我的代码可以在 32 位和 64 位配置中编译,但只有第一个运行良好。我用depends.exe打开了库,如果是64位,我会看到两条错误消息:

错误:由于缺少一个模块,至少有一个模块存在未解析的导入 隐式依赖模块中的导出函数。 错误:发现具有不同 CPU 类型的模块。

在depends.exe 的模块列表中,我看到我的dll 的CPU 类型是x64,但其他一切都是x86(其他一切都应该是动态链接的)。在动态链接的情况下如何告诉 VC 使用 64 位库?

编译和链接过程中没有警告或错误信息。

考虑到配置,我根据 MS 的建议配置了我的解决方案,我认为这没有什么问题。我只能考虑缺少宏或错误的库依赖项或 VC 选项。

编辑: This 非常接近我的问题。

编辑2: 如果是 lib,我还会收到错误消息: 错误:至少一个文件不是 32 位或 64 位 Windows 模块。 和 未找到 DOS 或 PE 签名。此文件不是有效的 32 位或 64 位 Win 模块。

【问题讨论】:

【参考方案1】:

来自 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 检查它。也许有些混淆是因为术语 library 被重载了。 .lib 文件是一个库,可以是导入库或静态库。而DLL是一个库,一个动态链接库。在我上面写的内容中,我使用库来引用 DLL。

【讨论】:

当我尝试加载我的库时,我简单地收到符号未找到消息。我检查了我的 x64 代码,在depends.exe 中我确实看到了。我的WT在哪里?我需要一些,因为我还有零。 :-) 我不明白您所说的“当我尝试加载我的库时,我只是简单地收到未找到符号的消息”是什么意思。您能否逐字描述您采取的具体步骤、使用的工具以及错误消息。 我解决了。 1.) Depends.exe 仍然显示混合 CPU 2.) 基本上我更改了编译设置。如果我对我所做的事情有清楚的了解,我会写在这里。

以上是关于在 MS VC 2013 Express 中将 C++ dll 从 32 位转换为 64 位的主要内容,如果未能解决你的问题,请参考以下文章

在列表框 ms-access 2013 VBA 中将多个不同的字段作为列表项返回

在 vc++ 中将 Unicode 字节数组转换为 CString

MS Visual Studio 2012 Express 是不是同时包含 C#、Visual Basic、C++? [关闭]

用户可以在 MS Access 2013 中将记录添加到拆分数据库的前端吗?

如何在 vc 6.0 中将对象转换或分配为 Variant 类型

如何在 Visual Studio 2013 Express 中打开 C++ 项目?遇到很多错误