我有一个有多个依赖项的32位应用程序。对依赖性的粗略估计如下 -
[handshake_win32.exe] ----> [libhandshake32.dll] ----> [libeay32,ssleay32.dll] ----> [zlib1.dll]
现在我想通过JNI使用我的libhandshake32.dll来重用代码。由于JVM是64位的,所以我想这些库需要重新编译为x64 arch。
我的第一个目标是在x64中运行当前基线handshake_win32.exe。所以我已经重新编译了x64的所有dll。但是在我成功重新编译后,当我开始进入调试模式时,我在主函数处立即获得Stack Overflow。
handshake_win32.exe中0x000007f602f79567处的未处理异常: 0xC00000FD:堆栈溢出。
我试图用dumpbin检查dll签名,似乎所有机器类型都是x64。 dependency walker为所有x64模块提供以下错误消息 -
错误:由于缺少,至少有一个模块具有未解析的导入 隐式依赖模块中的导出函数。错误:带有的模块 找到了不同的CPU类型。
它显示加载了x86版本的MSVCR100.dll,其中实际dll的arch是x64。
有谁能说明这个问题的可能原因是什么?
提前致谢。
答案 0 :(得分:0)
1,如果使用cmd / bat编译你的dll, 以这种方式启动cmd / bat:
%comspec% /k ""PATH_TO_VS\VC\vcvarsall.bat"" amd64
或
%comspec% /k ""PATH_TO_VS\VC\vcvarsall.bat"" x86_amd64
而不是:
%comspec% /k ""PATH_TO_VS\VC\vcvarsall.bat"" x86
2,如果你使用gui,你最好检查一下命令行:
c/c++->command line
linker->command line
有时,当您在vs gui中更改配置时,命令行不会更改, 你最好开始一个新项目并在那里复制你的源文件。