一个小菜鸡的学习记录。 2023-09-21 15:31 采纳率: 57.1%
浏览 17
已结题

qt https 依赖openssl 静态库

一、前提
1.编译好的qt静态工具链
2.编译好的openssl(下载的也是对应QT适应的openssl版本 openssl-1.1.1v.)
3.动态库能够正常请求https

二、问题
链接静态库时,请求时一直报错:TLS initialization failed

三、所做工作
1.网上查 TLS initialization failed 是因为openssl 版本不对;但是动态库没问题,应该不是版本问题吧?
2.编译好的静态库名称

libcrypto_static.lib
libssl_static.lib

3.打印qt 静态工具链支持的openssl 版本

//获取 Qt 所支持的版本
qDebug() << "OpenSSL支持的版本:" << QSslSocket::sslLibraryBuildVersionString();
//判断当前 Qt 是否支持 OpenSSL
qDebug() << "OpenSSL支持情况:" << QSslSocket::supportsSsl();

输出(不要在意中文乱码)

OpenSSL支持的版本:  "OpenSSL 1.1.1v  1 Aug 2023"
OpenSSL支持情况: false

四、所要结果
已经卡好几天了,又是编译静态工具链 又是编译openssl ,实在不知道什么原因了

  • 写回答

8条回答 默认 最新

  • 急速光粒 2023-09-21 15:57
    关注

    静态库openssl也是编译还是直接下载的,下载的话是否版本不一致。如果是编译的,可以调试看一下。或者截图错误出来看一下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • mideum 2023-09-21 16:30
    关注

    没看懂,那你编译好的qt静态工具链是链接静态的openssl吗,如果不是的话你自己项目再链接静态的openssl对qt的https没有作用的啊

    评论
  • 专家-赤兔[在线] 2023-09-21 15:47
    关注

    引用 皆我百晓生 小程序回应内容作答:
    从你的描述来看,有几个可能导致问题的原因:

    1. OpenSSL版本不匹配:你提到已经确认了Qt静态工具链支持的OpenSSL版本为OpenSSL 1.1.1v,但是当你打印QSslSocket::supportsSsl()的结果时,返回为false,这意味着当前Qt版本不支持使用OpenSSL。你可以尝试确认一下你使用的Qt版本是否与你编译的静态工具链版本匹配。

    2. 缺少链接库:你提到已经有编译好的静态库libcrypto_static.lib和libssl_static.lib,但是你需要确保在编译你的Qt项目时,通过正确的方式链接这些静态库。在Qt项目的.pro文件中,你可以使用LIBS关键字指定要链接的库文件。

    示例:

    LIBS += -L/path/to/openssl/lib -lssl_static -lcrypto_static

    1. 编译选项不正确:在编译Qt项目时,确保你使用了正确的编译选项。特别是对于需要使用OpenSSL的项目,需要在编译时指定正确的头文件和库文件路径。你可以在.pro文件中使用INCLUDEPATH和LIBS选项指定正确的路径。

    示例:

    INCLUDEPATH += /path/to/openssl/include
    LIBS += -L/path/to/openssl/lib -lssl_static -lcrypto_static

    希望这些提示能帮助你解决问题。如果问题仍然存在,可能需要更详细的信息来进行进一步的排查。

    评论
  • Leodong. 2023-09-21 16:33
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    从你提供的信息来看,你的Qt静态工具链支持的OpenSSL版本是"OpenSSL 1.1.1v 1 Aug 2023",但是实际上动态库能够正常请求https,所以应该不是版本问题。

    关于TLS初始化失败的问题,可能的原因有以下几点:

    1、 确保静态库和动态库的链接顺序正确。在项目文件中,将静态库放在动态库之后,例如:

    LIBS += -L/path/to/static/libs -lstatic_lib
    LIBS += -L/path/to/dynamic/libs -ldynamic_lib
    

    2、 检查静态库和动态库的路径是否正确。确保它们位于正确的文件夹中,并且文件名没有错误。

    3、 检查项目文件中是否包含了正确的头文件。确保在源文件中包含了正确的OpenSSL头文件,例如:

    #include <openssl/ssl.h>
    #include <openssl/crypto.h>
    

    4、 如果以上方法都无法解决问题,可以尝试重新编译OpenSSL,并确保生成的静态库和动态库与Qt兼容。

    希望这些建议能帮助你解决问题。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论 编辑记录
  • 数据大魔王 2023-09-21 16:34
    关注

    "TLS initialization failed"错误通常是因为静态链接的OpenSSL库与Qt库之间存在版本不匹配或不一致的问题
    如果你确定Qt和OpenSSL版本匹配,尝试重新构建Qt并确保在构建Qt时正确配置了OpenSSL支持。在Qt的构建过程中,你需要使用-openssl选项来指定OpenSSL库的路径。例如:

    ./configure -openssl-linked -I /path/to/openssl/include -L /path/to/openssl/lib
    

    然后重新编译Qt。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-21 18:06
    关注

    【以下回答由 GPT 生成】

    这个问题可能由于跨平台构建和链接时找不到正确的静态库文件导致。您可以尝试以下步骤来解决这个问题:

    1. 确保您已正确编译并安装了 OpenSSL 静态库。
    2. 检查您的 Qt 静态工具链是否链接到了正确的 OpenSSL 静态库。您可以使用 -L-l 选项来指定您的 OpenSSL 库的位置和名称。确保 libcrypto_static.liblibssl_static.lib 被链接进您的应用程序中。

    例如,在 Visual Studio 中,您可以在 Qt 项目的 .pro 文件中添加以下代码来指定链接选项:

    QMAKE_LIBDIR += /path/to/openssl/libs
    LIBS += -L/path/to/openssl/libs -lssl_static -lcrypto_static
    
    1. 检查您的应用程序是否正确引入了 OpenSSL 的头文件。在您的源代码中,使用 #include <openssl/opensslv.h> 来引入 OpenSSL 的版本号头文件。

    2. 确保您的应用程序链接顺序正确。在 Windows 平台上,静态库应该在动态库之前被链接。

    3. 检查在编译时是否使用了正确的编译选项来支持静态链接。请确保使用了正确的编译选项,使其与您的 OpenSSL 版本和静态库兼容。

    如果在尝试以上步骤后问题仍然存在,您可能需要查看编译和链接过程中的详细错误信息,以了解问题的具体原因。

    希望这些步骤能帮助您解决问题,如果您有任何进一步的疑问,请告诉我。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • Jackyin0720 2023-09-21 21:49
    关注

    参考结合GPT4.0、文心一言,如有帮助,恭请采纳。
    个人建议尝试使用动态链接的OpenSSL库,而不是静态链接的版本。这样可以确保与Qt和其他依赖项的兼容性。

    从你提供的信息来看,问题可能与尝试使用静态链接的OpenSSL库有关。通常,Qt使用的是动态链接的OpenSSL库。
    如果必须要使用晶体链接,首先,请确保你的Qt版本支持静态链接。
    其次,正确配置了Qt以使用静态OpenSSL库。在Qt项目文件(.pro)中,需要添加以下行:
    LIBS += -lssl -lcrypto
    然后,在编译OpenSSL库时使用了与Qt相同的编译器和架构。如果使用了不同的编译器或架构,可能会导致不兼容的问题。
    另外,尝试检查你的OpenSSL库是否正确编译?使用以下命令来测试它们:

    #include <openssl/ssl.h>  
    #include <openssl/err.h>  
      
    int main() {  
        SSL_library_init();  
        SSL_load_error_strings();  
        return 0;  
    }
    
    评论
  • 小明说Java 2023-09-22 10:14
    关注

    引用文心一言:
    从你提供的信息来看,你遇到的问题可能是Qt静态工具链和OpenSSL的静态库链接问题。你已经确认了动态库可以正常工作,这说明你的OpenSSL版本和Qt版本在动态链接时是兼容的。然而,当你尝试使用静态链接时,出现了 "TLS initialization failed" 错误。

    首先,请确保你的OpenSSL静态库(libcrypto_static.lib和libssl_static.lib)是正确编译的,并且与你的Qt静态工具链版本兼容。

    然后,你需要确保在链接过程中正确地引入了这两个库。在你的项目文件(.pro)中,你应该添加如下内容:

    
    LIBS += -lcrypto_static -lssl_static
    
    

    此外,你提到 QSslSocket::supportsSsl() 返回 false。这可能是因为Qt在静态编译时并没有包含OpenSSL的支持。你需要在Qt的配置选项中添加OpenSSL的支持。

    如果你是通过 configure 脚本来配置Qt,你可以尝试添加 -openssl-linked 选项:

    
    ./configure -openssl-linked
    

    然后重新编译Qt。

    另外,你还需要检查你的应用程序是否正确地加载了OpenSSL库。你可以通过 QSslSocket::sslLibraryBuildVersionString() 来检查。如果这个函数返回的是一个空的字符串,那么说明OpenSSL库并没有被正确地加载。

    希望这些信息能够帮助你解决问题。如果问题仍然存在,那么我建议你检查一下你的编译器和链接器的设置,以确保它们是正确的,并且与你的Qt版本和OpenSSL版本兼容。

    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月22日
  • 已采纳回答 9月22日
  • 修改了问题 9月21日
  • 创建了问题 9月21日

悬赏问题

  • ¥30 哈夫曼编码译码器打印树形项目
  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色