instalar - qt for mac
¿Por qué QsslSocket trabaja con Qt 5.3 pero no con Qt 5.7 en Debian Stretch? (5)
Debe cambiar estos enlaces simbólicos: en / usr / lib / x86_64-linux-gnu en la forma: libcrypto.so -> libcrypto.so.1.1 libssl.so -> libssl.so.1.1
a:
libcrypto.so -> libcrypto.so.1.0.2 libssl.so -> libssl.so.1.0.2
Tengo una aplicación que utiliza la clase QWebSocket pero no SSL. Funciona bien cuando ejecuto una versión compilada con Qt 5.3 pero un ejecutable Qt 5.7 se congela en las siguientes advertencias:
QSslSocket: cannot resolve CRYPTO_num_locks
QSslSocket: cannot resolve CRYPTO_set_id_callback
QSslSocket: cannot resolve CRYPTO_set_locking_callback
QSslSocket: cannot resolve ERR_free_strings
QSslSocket: cannot resolve EVP_CIPHER_CTX_cleanup
QSslSocket: cannot resolve EVP_CIPHER_CTX_init
QSslSocket: cannot resolve sk_new_null
QSslSocket: cannot resolve sk_push
QSslSocket: cannot resolve sk_free
QSslSocket: cannot resolve sk_num
QSslSocket: cannot resolve sk_pop_free
QSslSocket: cannot resolve sk_value
QSslSocket: cannot resolve SSL_library_init
QSslSocket: cannot resolve SSL_load_error_strings
QSslSocket: cannot resolve SSL_get_ex_new_index
QSslSocket: cannot resolve SSLv2_client_method
QSslSocket: cannot resolve SSLv3_client_method
QSslSocket: cannot resolve SSLv23_client_method
QSslSocket: cannot resolve SSLv2_server_method
QSslSocket: cannot resolve SSLv3_server_method
QSslSocket: cannot resolve SSLv23_server_method
QSslSocket: cannot resolve X509_STORE_CTX_get_chain
QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf
QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf
QSslSocket: cannot resolve SSLeay
QSslSocket: cannot resolve SSLeay_version
QSslSocket: cannot call unresolved function CRYPTO_num_locks
QSslSocket: cannot call unresolved function CRYPTO_set_id_callback
QSslSocket: cannot call unresolved function CRYPTO_set_locking_callback
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function sk_num
No veo estas advertencias en la versión 5.3 (que funciona correctamente), lo que sugiere que no debo ignorarlas, como se pregunta en esta pregunta . Además, QT += network
ya está en mi src.pro .
Me hicieron creer que Debian eliminó estos símbolos del paquete openssl . ¿Alguien podría decirme qué está pasando aquí y cómo podría arreglar esto?
Información del sistema
Estoy corriendo en el tramo de Debian
$ uname -r
4.8.0-2-amd64
Tengo openssl y libssl-dev instalados
openssl is already the newest version (1.1.0c-2).
libssl-dev is already the newest version (1.1.0c-2).
He intentado ejecutar esto con Qt 5.3 y 5.7
$ qmake -v
QMake version 3.0
Using Qt version 5.7.1 in /usr/lib/x86_64-linux-gnu
Tienes que instalar el siguiente paquete para solucionar el problema.
sudo apt instalar libssl1.0-dev
Tuve el mismo problema en un servidor de debian stretch. Lo arreglé con la ayuda del comentario de 7hibaults.
Ejecutar el siguiente comando solucionó el problema para mí:
sudo apt-get install libssl1.0-dev
TL; DR
Debian Stretch se envía con OpenSSL 1.1; Qt utiliza OpenSSL 1.0; Dale a Qt lo que necesita:
apt install libssl1.0-dev
Respuesta detallada
A partir de esta respuesta sobre OpenSSL y Qt , encontré una sugerencia y mostré la versión de la biblioteca SSL utilizada para el tiempo de compilación y tiempo de ejecución utilizando:
qDebug()<<"SSL version use for build: "<<QSslSocket::sslLibraryBuildVersionString();
qDebug()<<"SSL version use for run-time: "<<QSslSocket::sslLibraryVersionNumber();
qDebug()<<QCoreApplication::libraryPaths();
Y muestra:
SSL version use for build: "OpenSSL 1.0.1e-fips 11 Feb 2013"
... lot of SSL warnings...
SSL version use for run-time: 0
("/opt/Qt/5.8/gcc_64/plugins", "/home/Project/..../build...Desktop_Qt_5_8_0_GCC_64bit-Release/src/release/build_linux_64")
Pero Debian Stretch se envía con OpenSSL 1.1. Como se esperaba, todos los subprocesos en la web sobre este problema son verdaderos: este es un problema de compatibilidad de la versión de la biblioteca OpenSSL.
"Instalar libssl1.0-dev" y el problema se resolvió. Todavía tengo 2 advertencias de SSL sobre SSLv3, pero al menos esto es solo una advertencia (leí algo en la Web sobre eso, no hay forma de encontrarlo nuevamente).
SSL version use for build: "OpenSSL 1.0.1e-fips 11 Feb 2013"
QSslSocket: cannot resolve SSLv3_client_method
QSslSocket: cannot resolve SSLv3_server_method
SSL version use for run-time: 268443839
("/opt/Qt/5.8/gcc_64/plugins", "/home/Project/..../build...Desktop_Qt_5_8_0_GCC_64bit-Release/src/release/build_linux_64")
Resumen
Hasta que Qt admita OpenSSL 1.1, puede:
- Instalar OpenSSL 1.0 (posible en Debian)
- Compile OpenSSL 1.0 e instálelo (no probé, pero debería funcionar como 1.)
- Envíe OpenSSL 1.0 con su aplicación Qt (no probé, pero debería funcionar como 1.)
- Recompile Qt con la opción "-openssl-linked" (según esta respuesta , no hice la prueba y no quiero hacerlo)
La respuesta de Fylhan no funciona bajo Debian Buster ya que libssl1.0-dev era un paquete de transición y ya no es compatible.
Hay un informe de error en el sitio web de Qt y, de acuerdo con el comentario de Giuseppe d''Angelo, existen las siguientes soluciones:
Solución 1
Si su distribución tiene un directorio para OpenSSL 1.0 con los enlaces simbólicos correctos (por ejemplo, Arch tiene /usr/lib/openssl-1.0/libssl.so) use LD_LIBRARY_PATH para forzar la búsqueda de ese directorio primero.
Solución 2
Haga su propio directorio con enlaces simbólicos, y use LD_LIBRARY_PATH para eso.
Solución 3
Reconstruye tu propio Qt.
Podría solucionar el problema utilizando la segunda solución, con los comandos detallados a continuación en mi caso:
-
mkdir openssl1.0 ; cd openssl1.0
-
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 libssl.so.1.0.2
-
ln -s libssl.so.1.0.2 libssl.so
- en QtCreator, Projects> Desktop Qt 5.8.0> Build> Build Environment> Add: Variable LD_LIBRARY_PATH, Value /path/to/dir/openssl1.0 (o agregue
LD_LIBRARY_PATH="/path/to/dir/openssl1.0"
antes su comando desde la consola)
Es posible que tengas que hacer lo mismo con libcrypto.so también, pero esto fue suficiente para mí. Esta solución le impide cambiar los enlaces simbólicos para todo el sistema.