Axis2C与OpenSSL - 没有OPENSSL_APPLINK错误

时间:2010-12-14 11:02:20

标签: visual-studio-2008 web-services visual-c++ openssl axis2c

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

OPENSSL_UPLINK:没有OPENSSL_APPLINK。

我读到你应该做的一些事情,比如applink.c文件中的链接到我的应用程序。我做到了,(使用extern“C”),我也称为CRYPTO_malloc_init。他们两个都是无效的......我有点迷失在这里。

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

谢谢!

Roey。

3 个答案:

答案 0 :(得分: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而不是静态时,我无法写它。

答案 1 :(得分: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 makefile中的其他更改,请将文件复制到以下dir-structure:

<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)

<强> AXIS2C

配置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安装

所有必要文件都在文件夹中: \构建\部署

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

答案 2 :(得分:0)

根据openssl faq

  

根据0.9.8,.DLL消除了上述限制。 OpenSSL的   .DLL用一些特定的运行时选项编译[我们坚持   可以使用不同的应用程序部署默认/ MD]   选项甚至不同的编译器。但是有一个问题!代替   重新编译OpenSSL工具包,就像之前一样   版本,您必须使用编译器和/或编译小C片段   您选择的选项。该片段安装为   /include/openssl/applink.c,应该添加到   你的应用程序项目或只是#include-d在一个[而且只有一个]   您的应用程序源文件。无法将此填充程序模块链接到   你的应用程序表现为致命的&#34;没有OPENSSL_Applink&#34;   运行时错误。在这种情况下,明确的提醒是由于   [混合编译器选项]添加CRYPTO_malloc_init同样重要   之前第一次打电话给OpenSSL。

所以只需在项目中加入applink.c即可。享受!