可能与世界本身一样古老的东西(如果你允许我略微夸张)。
我正在以32位编译Visual Studio Express 2015中的DLL,并在32位的虚拟项目中对其进行测试。
来一个想要64位的人。我进入我的项目设置并将所有内容更改为x64(DLL和虚拟应用程序)。但是现在编译虚拟应用程序失败了,因为虚拟项目中使用的符号应该在DLL中找到,但在链接时无法解析。我知道x64没有像x86那样装饰符号名称,但实际上谁在乎呢?我的虚拟项目和我的DLL现在都在x64中编译(我检查过)。
我的架构的一些信息:两个子项目(编译单元)都是常见“解决方案”的一部分(因为它在Visual Studio中调用),因此共享一个通用配置(我检查过,x64在解决方案级别暗示x64在虚拟级别和DLL级别,因为两个/ 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位而没有警告我?