QSslSocket 使用Openssl的问题

QSslSocket 使用Openssl的问题:
运行qt程序报错如下
qt.network.ssl: QSslSocket: cannot resolve CRYPTO_num_locks
qt.network.ssl: QSslSocket: cannot resolve CRYPTO_set_id_callback
qt.network.ssl: QSslSocket: cannot resolve CRYPTO_set_locking_callback
qt.network.ssl: QSslSocket: cannot resolve ERR_free_strings
qt.network.ssl: QSslSocket: cannot resolve EVP_CIPHER_CTX_cleanup
qt.network.ssl: QSslSocket: cannot resolve EVP_CIPHER_CTX_init
qt.network.ssl: QSslSocket: cannot resolve sk_new_null
qt.network.ssl: QSslSocket: cannot resolve sk_push
qt.network.ssl: QSslSocket: cannot resolve sk_free
qt.network.ssl: QSslSocket: cannot resolve sk_num
qt.network.ssl: QSslSocket: cannot resolve sk_pop_free
qt.network.ssl: QSslSocket: cannot resolve sk_value
qt.network.ssl: QSslSocket: cannot resolve SSL_library_init
qt.network.ssl: QSslSocket: cannot resolve SSL_load_error_strings
qt.network.ssl: QSslSocket: cannot resolve SSL_get_ex_new_index
qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv3_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv23_client_method
qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method
qt.network.ssl: QSslSocket: cannot resolve SSLv3_server_method
qt.network.ssl: QSslSocket: cannot resolve SSLv23_server_method
qt.network.ssl: QSslSocket: cannot resolve X509_STORE_CTX_get_chain
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf
qt.network.ssl: QSslSocket: cannot resolve SSLeay
qt.network.ssl: QSslSocket: cannot resolve SSLeay_version
qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_num_locks
qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_set_id_callback
qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_num_locks
qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_set_id_callback
qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_free_strings
经过分析 openssl-1.1.0f so库没有相关
这里写图片描述

Openssl-1.0.2l匹配到
这里写图片描述

重新构建Qt SDk

./configure -prefix /usr/local/Qt5.8_linux \
-opensource \
-release \
-confirm-license \
-xplatform linux-g++ \
-shared \
-qt-zlib \
-no-gif \
-qt-libjpeg \
-no-opengl \
-no-cups \
-no-glib \
-no-dbus \
-no-rpath \
-no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 \
-no-avx \
-openssl \
-openssl-linked OPENSSL_LIBS=’-L/mnt/vd2016/workspace/QT/openssl-1.0.2l -lssl -lcrypto’\
-nomake tools \
-qreal float \
-qt-libpng \
-no-pch \
-pkg-config \
-evdev \
-I/mnt/vd2016/workspace/QT/openssl-1.0.2l/include/openssl

在Qt5.8.0/5.8/Src/qtbase/src/network/下 make 生成/Qt5.8.0/5.8/Src/qtbase/lib/libQt5Network.so.5.8.0
即在sdk中先构建成功 ,如果-L openssl1.1.0f的 话,会在链接时报错 (CRYPTO_num_locks)
把libQt5Network.so.5.8.0 复制到/Qt5.8.0/5.8/gcc_64/lib
cp Src/qtbase/lib/libQt5Network.so.5* ./gcc_64/lib/
把openssl-1.0.2l 的
cp libssl.so* libcrypto.so* /mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/ -fr
之后运行qt程序 OK

总结:报该错是因为ssl server程序执行时会调用libcrypto.so里,构建libQt5Network.so时也要调用libcrypto.so 。(当前使用openssl-1.0.2l 解决)

使用新构建的libQt5Network.so会报错如下:

g++ -Wl,-O1 -Wl,-rpath,/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib -o server main.o server.o serverthread.o moc_server.o moc_serverthread.o -L/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib -lQt5Widgets -lQt5Gui -lQt5Network -lQt5Core -lGL -lpthread
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_inflate@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_deflate@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_inflateSetDictionary@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_inflateInit2_@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_inflateEnd@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_inflateInit_@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_deflateEnd@Qt_5’未定义的引用
/mnt/vd2016/workspace/QT/Qt5.8.0/5.8/gcc_64/lib/libQt5Network.so:对‘z_deflateInit_@Qt_5’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:243: recipe for target ‘server’ failed
make: * [server] Error 1

由于这个链接错误,我仍用没有增加配置项 -openssl 构建的Qt库libQt5Network.so 生成自己的qt应用程序。
由此分析QsslSocket 并不需要在Qt sdk 配置时增加选项 -openssl 。
如果使用增加了配置项 -openssl生成的libQt5Network.so ,上面哪个错误 怎么解决?已经解决了的,请不吝赐教。
在Qt sdk配置时增加选项 -openssl 的作用不甚理解,是不是和直接在自己的qt程序里链接libssl.so和libcrypto.so作用一样,请大神告知。

你可能感兴趣的:(QT)