提问人:Charles 提问时间:3/20/2017 最后编辑:Charles 更新时间:3/20/2017 访问量:135
项目成功链接到 32 位的 DLL,但不能链接到 64 位的 DLL
Project successfully links to DLL in 32 bits, but not in 64 bits
问:
它可能和世界本身一样古老的东西(如果你允许我稍微夸张的话)。
我在 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位而没有警告我?
答: 暂无答案
评论
__declspec(dllimport)
__declspec(dllexport)
__declspec(dllimport)
__imp_