【问题标题】:QSslSocket cannot resolve and Permission Denied errorQSslSocket 无法解析和 Permission Denied 错误
【发布时间】:2018-04-25 18:57:59
【问题描述】:

错误信息如下:

qt.network.ssl:QSslSocket:无法解析 TLSv1_1_client_method

qt.network.ssl:QSslSocket:无法解析 TLSv1_2_client_method

qt.network.ssl:QSslSocket:无法解析 TLSv1_1_server_method

qt.network.ssl:QSslSocket:无法解析 TLSv1_2_server_method

qt.network.ssl:QSslSocket:无法解析 SSL_select_next_proto

qt.network.ssl:QSslSocket:无法解析 SSL_CTX_set_next_proto_select_cb

qt.network.ssl:QSslSocket:无法解析 SSL_get0_next_proto_negotiated

qt.network.ssl:QSslSocket:无法解析 SSL_set_alpn_protos

qt.network.ssl:QSslSocket:无法解析 SSL_CTX_set_alpn_select_cb

qt.network.ssl:QSslSocket:无法解析 SSL_get0_alpn_selected

我运行 Windows 7 机器,在我的 D: 驱动器上安装了 openssl 1.1.0。我正在使用 Qt5.9.0

我的 .pro 文件

QT += core network
QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += main.cpp \
    server.cpp \
    commands.cpp \
    packet.cpp

HEADERS += \
    server.h \
    commands.h \
    packet.h

INCLUDEPATH += D:\OpenSSL-Win32\include\openssl
INCLUDEPATH += D:\OpenSSL-Win32\bin
LIBS += -L D:\OpenSSL-Win32\lib -llibcrypto
LIBS += -L D:\OpenSSL-Win32\lib -llibssl

这是触发错误的代码:

QString Commands::getPublicIp()
{

    QString temp;

    QNetworkAccessManager networkManager;
    QUrl url("http://api.ipify.org");

    QString query = "format=json";

    url.setQuery(query);

    QNetworkReply* reply = networkManager.get(QNetworkRequest(url));

    QObject::connect(
                reply
                , &QNetworkReply::finished
                , [&](){

                        if(reply->error() != QNetworkReply::NoError) {
                            return QString();
                        } else {
                                QJsonObject jsonObject= QJsonDocument::fromJson(reply->readAll()).object();
                                QHostAddress ip(jsonObject["ip"].toString());

                                temp = QString("002 " + ip.toString());
                        }

                reply->deleteLater();
                }
            );

    return temp;

}

我不断收到 qt.network.ssl 错误,链接 openssl 后我不断收到编译错误:

:-1: 错误:找不到 D:\OpenSSL-Win32\lib: 权限被拒绝

:-1: 错误:找不到-llibssl

collect2.exe:-1: 错误:错误:ld 返回 1 个退出状态

尽管我目前没有使用 OpenSSL,但我愿意以后使用它。

【问题讨论】:

  • "我正在使用 Qt5.9.0" - 我可以理解在最新版本上使用 Qt (5.9) 的当前 LTS 分支,但您真的想要使用该分支的最新错误修复版本(撰写本文时为 Qt 5.9.5) - 与 5.9.0 相比,有 许多 个重要的错误修复和性能改进。只是一条建议:-)

标签: c++ qt openssl qsslsocket


【解决方案1】:
  1. 仅从 Qt 5.10 开始支持 OpenSSL 1.1.0。请使用 OpenSSL 1.0.2l,您可以使用与您的编译器匹配的预编译包,来自npcglib

  2. 您的 LIBS += 包含正确,但您的计算似乎没有权限或找不到库。无法说明为什么会发生此错误。验证文件夹中是否存在库以及您的用户是否有权访问。

  3. QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)是一个异步调用。您的函数QString Commands::getPublicIp() 可能会在请求完成之前返回一个空的QString。

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 2015-08-09
    • 2022-10-26
    • 2022-11-10
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多