在 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 中将记录添加到拆分数据库的前端吗?