C++ 转换为C++;MS VC 2013 Express中从32位到64位的dll

C++ 转换为C++;MS VC 2013 Express中从32位到64位的dll,c++,windows,visual-studio,dll,C++,Windows,Visual Studio,Dll,我的代码可以在32位和64位两种配置下编译,但只有第一种配置运行良好。我用Dependes.exe打开了库,如果是64位,我会看到两条错误消息: 错误:至少有一个模块由于缺少 导出隐式相关模块中的函数。 错误:找到具有不同CPU类型的模块 在depends.exe的模块列表中,我看到我的dll的CPU类型是x64,但其他所有东西都是x86(其他所有东西都应该动态链接)。在动态链接的情况下,我如何告诉VC使用64位库 编译和链接期间没有警告或错误消息 考虑到配置,我根据微软的建议配置了我的解决方案

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

错误:至少有一个模块由于缺少 导出隐式相关模块中的函数。 错误:找到具有不同CPU类型的模块

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

编译和链接期间没有警告或错误消息

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

编辑: 很接近我的问题

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

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

当我尝试加载lib时,我会简单地获取symbol not found消息。我检查了我的x64代码,在depends.exe中我确实看到了这一点。我的WT在哪里?我需要一些,因为我还有零。:-)我不明白你所说的“当我试图加载我的库时,我简单地得到symbol not found消息”是什么意思。你能描述一下你采取的确切步骤、使用的工具以及错误消息吗?我已经解决了。1.)Depends.exe仍然显示混合CPU 2.)基本上我更改了编译设置。如果我对我所做的事情有一个清晰的了解,我会写在这里。