QT使用HTTPS出错:ssl: QSslSocket: cannot callunresolved function或者Error creating SSL context

网上有关于这方面的很多说明,大多只是说明缺少https所依赖的两个库:libeay32.dll和ssleay32.dll。但是还是需要具体情况具体分析,因为openssl的这两个库属于开源性质的,有不少不同的版本,比如QT用的版本和其它软件用的版本就可能不同,不同版本的库交叉使用同样可能存在问题;

问题:在开发机上使用https没有任何问题,但是在干净的虚拟机上发现,即使libeay32.dll和ssleay32.dll在程序的可执行目录下,仍然会报错:

qt.network.ssl: QSslSocket: cannot call unresolvedfunction SSLv23_client_method

qt.network.ssl: QSslSocket: cannot callunresolved function SSL_CTX_new

qt.network.ssl: QSslSocket: cannot callunresolved function SSL_library_init

qt.network.ssl: QSslSocket: cannot callunresolved function ERR_get_error

qt.network.ssl: QSslSocket: cannot callunresolved function ERR_get_error

 

解决问题思路:出现此类报错时,基本可以确定的是ssl库没有自动加载成功或者加载的版本不对;那么在开发机上,运行出错的应用程序,通常在开发机上只要dll存在,是不会出错的,这里通过ProcessExplorer进程依赖库等查看工具或者vs的调试模式下,查找本程序所使用的ssleay32.dll的绝对路径,然后把这两个dll放到可执行目录下即可;

注意:由于开发机环境通常比较复杂,即使QT的安装目录下有libeay32.dll和ssleay32.dll也不一定应用程序就使用的是qt安装目录下的库文件,至少我这qt5.8的版本碰到了这样的现象;

另外一种思路:可以在应用程序开发时,强制链接自己指定版本的libeay32.dll和ssleay32.dll,但是需要其对应的lib库或者在代码显式load这两个dll; 

终极解决方法:

在出问题的机器上与没出问题的机器上,分别用depands打开libeay32.dll,查看全路径,看看其依赖的所有库的版本是否一样,特别是msvcr120.dll等库,32位和64位的差异有些版本挺多的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值