0

我有一个工作的 32 位应用程序有几个依赖项。对依赖关系的粗略估计如下 -

[handshake_win32.exe] ----> [libhandshake32.dll] ----> [libeay32, ssleay32.dll] ----> [zlib1.dll]

现在我想通过 JNI 使用我的 libhandshake32.dll 进行代码重用。由于 JVM 是 64 位的,所以我猜这些库需要为 x64 架构重新编译。

我的第一个目标是在 x64 中运行当前的基线 handshake_win32.exe。所以我已经为x64重新编译了所有的dll。但是在我开始进入调试模式时成功重新编译后,我在主函数中立即得到堆栈溢出。

handshake_win32.exe 中 0x000007f602f79567 处未处理的异常:0xC00000FD:堆栈溢出。

我试图用 dumpbin 检查 dll 签名,它似乎都有机器类型 x64。依赖 walker 为所有 x64 模块提供以下错误消息 -

错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。错误:发现具有不同 CPU 类型的模块。

它表明 x86 版本的 MSVCR100.dll 在实际 dll 的拱门为 x64 的位置加载。

谁能建议这个问题的可能原因是什么?

提前致谢。

4

1 回答 1

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 中更改配置时,命令行不会更改,您最好启动一个新项目并将您的源文件复制到那里。

于 2013-08-08T03:30:44.503 回答