QSslSocket:无法调用未解析的函数

13

我正在使用Qt 5.7.1 (MSVC 2015, 32位)和Qt Creator 4.2.0。我遇到QSslSocket的问题,以下是错误信息:

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
我已经前往以下位置openssl github并下载了zip文件。 我将"libeay32.dll"和"ssleay32.dll"文件移动到我的发布目录中,但仍然出现错误。 有没有人使用过QSslSocket并能给我提供让套接字起作用的步骤或任何建议?

3
可能是 Unresolved Functions While Working With QSslSocket 的重复问题。 - drescherjm
很抱歉,我认为那是链接错误而不是运行时错误。我相信这个消息是由于在Qt中使用插件引起的。 - drescherjm
好的,感谢您的帮助。您有什么建议可以修复运行时错误吗?我已经查看了之前的主题“未解决的函数...”,但我相信我尝试了他们建议的解决方案(将dll复制到发布文件夹中),但它没有起作用。有什么建议吗?谢谢! - KirstenS
你在.pro文件中添加了QT += network吗? - drescherjm
你解决了吗?我也遇到了同样的问题。 - mohammad alabid
显示剩余3条评论
5个回答

11

我是通过谷歌搜索到这里的。在我的情况下,因为缺少正确版本的libeay32.dllssleay32.dll,所以在某些随机的电脑上出现了此错误。之所以是“随机”的,是因为有些计算机从其他软件中加载了这些文件,而有些则没有。

我通过将这些DLL文件添加到Qt安装的bin文件夹中来解决了Qt Creator的问题,并通过将上述DLL文件包含在我的发行版中来解决了分发问题。

DLL文件的版本应该与Qt首次编译时使用的OpenSSL版本相同或相似。如果您没有自己编译它,则可以从Qt 5.4开始使用QSslSocket::sslLibraryBuildVersionString()进行查询。(来源:https://dev59.com/kFgQ5IYBdhLWcg3w3Xwy#42297296)

不要忘记,64位应用程序应该有64位版本的DLL文件,而32位应用程序应该有32位DLL文件,这样您就不会像这个人那样遇到问题。


附加说明:

  • 从Qt 5.2开始,您必须使用1.0.0或更高版本。0.9.8不再支持。(来源:http://doc.qt.io/qt-5/ssl.html)
  • 对于我标准的MSVC2017x64发行版Qt 5.10.1,sslLibraryBuildVersionString()返回“OpenSSL 1.0.2o”。我在我的发行版中使用1.0.2p。
  • 自OpenSSL 1.1.0版本开始,OpenSSL DLL文件名称已更改为libcrypto-1_1*.dlllibssl-1_1*.dll。截至2018年9月,标准的Qt发行版尚未采用这些名称。
  • OpenSSL的GitHub下载链接在这里:https://github.com/openssl/openssl/tags
  • 希望这对下一个人有所帮助。很抱歉让旧帖子又浮上了水面。


    当然,您应确保打包的DLL与Qt编译时使用的OpenSSL版本相同。我该如何做到这一点? - sitting-duck
    1
    好问题!我在这里找到了一些提示[https://dev59.com/6prga4cB1Zd3GeqPrLvz#39497754]和[https://dev59.com/kFgQ5IYBdhLWcg3w3Xwy#42297296]。简而言之,使用`QSslSocket::sslLibraryBuildVersionString()`。我会把它加到我的答案中。 - Phlucious

    7

    将这两个文件复制到路径:'C:\Qt\Tools(msvc/mingw){version}\bin'

    C:\Qt\Tools\(msvc|mingw)\opt\bin\libeay32.dll
    C:\Qt\Tools\(msvc|mingw)\opt\bin\ssleay32.dll
    

    不确定是否是与MSVC有关,但绝对是MinGW的问题 :) - Chris Browet

    3
    您需要手动添加对OpenSSL的支持,因为Android已经不再提供支持,而我正在使用QT 5.9,它无法自动生成库文件。因此,您需要创建openSSL库。
    您可以直接从以下链接下载: https://wiki.openssl.org/index.php/Binaries 或者在这里下载: https://indy.fulgan.com/SSL/ 然后将这些文件复制并包含到您的项目中即可。
    libcrypto.so
    libssl.so
    

    应该可以正确工作

    或者你可以使用这个脚本生成你的 libcrypto.solibssl.so,只需按照步骤操作即可。 https://github.com/ekke/android-openssl-qt


    在Qt Android 4.4应用程序中,https网络请求正常工作。@mohammad alabid,您知道Android何时停止支持?Android >= 6.0?在Android 7.0上,相同的Qt应用程序失败了“qt.network.ssl: QSslSocket:无法调用未解析的函数SSL_CTX_ctrl”,尽管我可以看到两个ib.libcrypto.so和libssl.so在Android /system/lib/目录中? - Ed of the Mountain
    安卓已经不再支持SSlSockets,你尝试过构建.so文件了吗?你可以尝试使用这些文件 https://www.dropbox.com/s/w6cm09niyj185fb/openSSL.zip?dl=0 -将这三个文件添加到.pro文件旁边 -并在你的.pro文件中添加这一行 include(android-openssl.pri) - mohammad alabid
    请确保使用openssl 1.1,因为openssl 3已经弃用了这些函数:/ - Gearoid Murphy

    0

    通过结合这里的现有答案以及一些研究,我成功地使其与MSVC2017 x64编译器配合使用:

    1. 从此处下载1.0版本(Win64 OpenSSL v1.0.2r Light): https://slproweb.com/products/Win32OpenSSL.html
    2. 安装时选择将DLL复制到OpenSSL二进制目录。
    3. 然后从OpenSSL二进制文件夹中复制libeay32.dllssleay32.dll到:{Your_Qt_Folder}/{Qt_version}/msvc2017_64/bin

    0

    我解决了这个问题。

    1. 下载并安装v1.0.2s<<--(libeay32.dll, ssleay32.dll),下载链接:https://slproweb.com/products/Win32OpenSSL.html

    2. 复制libeay32.dllssleay32.dll

    3. 在Qt文件夹中找到QtNetwork*.dll。在我的情况下,路径为C:\Qt\Tools\QtCreator\bin

    4. libeay32.dllssleay32.dll粘贴到C:\Qt\Tools\QtCreator\bin中。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接