项目成功链接到 32 位的 DLL,但不能链接到 64 位的 DLL

Project successfully links to DLL in 32 bits, but not in 64 bits

提问人:Charles 提问时间:3/20/2017 最后编辑:Charles 更新时间:3/20/2017 访问量:135

问:

它可能和世界本身一样古老的东西(如果你允许我稍微夸张的话)。

我在 Visual Studio Express 2015 中以 32 位编译 DLL,并在 32 位的虚拟项目中对其进行测试。

有人想要 64 位。我进入我的项目设置并将所有更改为 x64(DLL 和虚拟应用程序)。但现在,虚拟应用的编译失败,因为在虚拟项目中使用的符号以及应在 DLL 中找到的符号在链接时无法解析。我知道 x64 不像 x86 那样装饰符号名称,但实际上谁在乎呢?我的虚拟项目和我的 DLL 现在都在 x64 中编译(我检查过)。

关于我的架构的一些信息:两个子项目(编译单元)都是通用“解决方案”的一部分(在 Visual Studio 中称为),因此共享通用配置(我检查过,解决方案级别的 x64 意味着虚拟级别和 DLL 级别的 x64,因为两个 /MACHINE 参数在各自的链接器选项中都设置为 x64,并且 DLL 可以自行编译)。 在我的DLL中,这些方法被声明为__declspec(dllexport),所以我不使用.def文件。它一直工作到现在,并且仍然在 Win32 模式下工作。然后,将同一头文件重新用于虚拟项目,__declspec(dllexport) 现在未定义。最终信息:DLL包含C++代码,但是导出为C方法的方法,在定义__cplusplus时声明为extern“C”(这里就是这种情况)(这是典型的技巧)。

顺便说一句,是的,到目前为止打开并工作的配置是“Release,Win32”而不是 x86。但两者在发布模式下同样有效。但是,在“调试”模式下,x86(或Win32)和x64都不起作用,并出现相同的错误(在链接时,虚拟中使用的所有外部都无法解析)。除了在 Win32 或 x86 中,它提到带有前导下划线的符号。

最后一个元素让我在 x86 中设置了符号装饰的线索,这在 x64 中不会发生。但同样,应该没关系,对吧?

提前感谢您的任何明智提示!

查尔斯

编辑1:我对发布模式感兴趣,我们可以稍后处理调试模式。

编辑 2 :我看到我的 DLL 在链接时有额外的依赖项,其中大多数的名称中有 32 个:kernel32.lib、user32.lib、...但它仍然以 64 位编译。但是,DLL是否因此而自动降级为32位而没有警告我?

C++ C 可视化工作室-2015 dllexport unresolved-external

评论

0赞 drescherjm 3/20/2017
您如何在客户端应用程序中使用 dll?我的意思是,当您使用dll时,它应该是.这就是为什么通常为此使用宏的原因,该宏会根据您是编译 dll 还是使用 dll 从 到 切换。__declspec(dllimport)__declspec(dllexport)__declspec(dllimport)
0赞 Charles 3/20/2017
就像我说的,我让特殊宏未定义,它适用于 Win32/x86。为什么不应该使用 x64 ?无论如何,它所改变的只是错误消息中报告的符号名称:它现在有一个前缀装饰。__imp_
1赞 Victor 3/20/2017
您是否为依赖项设置了正确的路径?请记住,需要为每个体系结构设置这些内容。您可以通过右键单击项目 -> 属性 -> 引用路径来找到它
0赞 Charles 3/20/2017
我找不到这样的“引用路径”属性菜单。我所拥有的特定于我的DLL的只是链接器属性中的附加依赖项,它只是声明LIB文件的名称(没有任何其他路径)。
0赞 Mathieu 3/21/2017
32 位和 64 位项目是否具有不同的临时目录/目标目录?虚拟项目是否尝试链接好的 (64) lib 文件?

答: 暂无答案