网上有关于这方面的很多说明,大多只是说明缺少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位的差异有些版本挺多的;