2

我在 VC++ 2008 中使用 Axis2C 和 OpenSSL 来访问 https 网络服务。每当进行实际通信时,我都会遇到运行时致命异常:

OPENSSL_UPLINK:没有 OPENSSL_APPLINK。

我读到您应该做几件事,例如在 applink.c 文件中链接到我的应用程序。我这样做了(使用 extern "C"),并且我还调用了 CRYPTO_malloc_init。他们两个都无效..我有点迷失在这里。

我还应该检查什么?另外,有人知道为什么axis2c有时会写入axis.log文件,有时不会吗?

谢谢!

罗伊。

4

3 回答 3

3

我有一个类似的问题,使用 OpenSSL 1.0.1e(从http://slproweb.com/products/Win32OpenSSL.html为 Win32 预编译)。

我不确定根本原因是什么,但是当我使用 VC 的静态库而不是 DLL 库重建我的应用程序时,问题就消失了。

换句话说,这个库对我来说失败了:

C:\OpenSSL-Win32\lib\libeay32.lib

但是再次链接这个库成功了

C:\OpenSSL-Win32\lib\VC\static\libeay32MD.lib

据我所知,这可能与与其他库的不兼容性有关(请参阅http://forums.epo.org/installation-and-maintenance/topic1373.html ),我的应用程序仅使用了 libeay32 库。

此外,它与 PEM 处理有关。我能够生成一个 RSA 密钥,但是当我链接到 DLL 而不是静态链接时,我无法编写它。

于 2013-03-12T21:56:53.890 回答
2

这可能是由于编译标志。以下是如何在 Windows 上编译 Axis2c + OpenSSL 64 位的描述。

使用 OpenSSL 创建 Axis2c 64 位

版本:

  • Axis2c 1.6.0
  • OpenSSL 1.0.0d

先决条件:

  • Perl 5(64 位版本)

Perl 应该在 %PATH% 系统环境变量中

OpenSSL

配置和编译 OpenSSL:

cd <openssl_root_dir> (e.g. C:\tmp\openssl-1.0.0b)
perl Configure VC-WIN64A
ms\do_win64a
nmake -f ms\ntdll.mak
cd out32dll
..\ms\test

为了防止 Axis2c 生成文件中的其他更改,请将文件复制到以下目录结构:

<openssl_root_dir>/bin (libeay32.dll, ssleay32.dll)
<openssl_root_dir>/lib  libeay32.lib, ssleay32.lib)
<openssl_root_dir>/include/openssl (all *.h, *.c files)

轴2c

配置 Axis2C

在 \build\win32\configure.in 中更改以下设置:

ENABLE_SSL = 1 OPENSSL_BIN_DIR =
<openssl_root_dir> (e.g.
C:\tmp\openssl-1.0.0b) CRUNTIME = /MD
EMBED_MANIFEST = 1

在 \build\win32\makefile 中更改以下设置:

LDFLAGS = $(LDFLAGS) /LIBPATH:$(OPENSSL_BIN_DIR)\lib
LIBS = $(LIBS) libeay32.lib ssleay32.lib

编译 Axis2C cd \build\win32 nmake install

所有必需的文件都在文件夹中:\build\deploy

可以手动将 2 个 OpenSSL dll 文件(libeay32.dll、ssleay32.dll)复制到 deploy\lib 子文件夹。

于 2011-02-16T08:28:44.137 回答
1

根据openssl 常见问题解答

根据 0.9.8,.DLL 消除了上述限制。使用某些特定运行时选项编译的 OpenSSL .DLL [我们坚持默认的 /MD] 可以与使用不同选项甚至不同编译器编译的应用程序一起部署。但是有一个问题!您必须使用编译器和/或您选择的选项来编译小的 C 代码片段,而不是像以前版本那样重新编译 OpenSSL 工具包。该片段安装为 /include/openssl/applink.c 并且应该添加到您的应用程序项目中,或者只是在一个 [并且只有一个] 应用程序源文件中添加 #include-d。未能将此 shim 模块链接到您的应用程序会显示为致命的“无 OPENSSL_Applink”运行时错误。

因此,只需将 applink.c 包含在您的项目中即可享受!

于 2014-03-16T11:02:10.763 回答