我在VC ++ 2008中使用Axis2C和OpenSSL来访问https webservice。 每当实际进行通信时,我都会遇到运行时致命异常:
OPENSSL_UPLINK:没有OPENSSL_APPLINK。
我读到你应该做的一些事情,比如applink.c文件中的链接到我的应用程序。我做到了,(使用extern“C”),我也称为CRYPTO_malloc_init。他们两个都是无效的......我有点迷失在这里。
我还应该检查什么?还有,有人知道为什么axis2c有时会写入axis.log文件,有时候不会吗?
谢谢!
Roey。
答案 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位
版本:
先决条件:
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即可。享受!