解决Linux下Qt程序报『QString::arg: Argument missing: 无法解析SSLv2_client_method中的符号』错误
在Linux开发Qt应用,程序会报这样的错误:
QString::arg:Argument missing: 无法解析SSLv2_client_method中的符号“SSLv2_client_method”:ssl,(/lib/x86_64-linux-gnu/libssl.so.1.0.0: undefined symbol: SSLv2_client_method)
QString::arg:Argument missing: 无法解析SSLv2_client_method中的符号“SSLv2_client_method”:crypto,(/lib/x86_64-linux-gnu/libcrypto.so.1.0.0: undefined symbol:SSLv2_client_method)
qt.network.ssl:QSslSocket: cannot resolve SSLv2_client_method
QString::arg:Argument missing: 无法解析SSLv2_server_method中的符号“SSLv2_server_method”:ssl,(/lib/x86_64-linux-gnu/libssl.so.1.0.0: undefined symbol: SSLv2_server_method)
QString::arg:Argument missing: 无法解析SSLv2_server_method中的符号“SSLv2_server_method”:crypto, (/lib/x86_64-linux-gnu/libcrypto.so.1.0.0:undefined symbol: SSLv2_server_method)
qt.network.ssl:QSslSocket: cannot resolve SSLv2_server_method
QString::arg:Argument missing: 无法解析res_nclose中的符号“res_nclose”:libresolv.so.2,(/lib/x86_64-linux-gnu/libresolv.so.2: undefined symbol: res_nclose)
这是在使用QString::arg( )函数的时候报的错误,查看了相关的帖子和资料,查到是Ubuntu这个操作系统带的OpenSSL库中,没有编译SSLv2这一类函数,估计是安全方面原因吧。
了解了问题的所在,我们来寻找一下解决方法。因为我们也无意修改Ubuntu的核心OpenSSL库,但是希望不报这样的错误,因此我们在构建OpenSSL的同时,不将其放在/usr/lib上,而是放在Qt的lib目录下,这样可以避免出现这样的错误。下面是具体的解决方法,不用担心,很快就能够解决。
1、从网络上下载OpenSSL库的源代码。地址是:
http://openssl.org
我们下载最新的OpenSSL 1.0.2b。
2、Ctrl +Alt + T,打开终端,定位下载的OpenSSL位置,我这里的命令是:
cd~/Develop/openssl-1.0.2b
3、配置一下OpenSSL,让它产生动态链接库:
./configenable-shared
4、执行构建
make
5、将产生的.so文件和它的链接复制到对应的QtSDK/lib文件夹中,具体来说是这几个文件:
libcrypto.so
libcrypto.so.1.0.0
libssl.so
libssl.so.1.0.0
这里我放在的位置是:
~/Develop/Qt5.5.0Beta/5.5/gcc_64/lib
再运行相关程序,遇到了QString::args( )函数的时候,就不报这些错误了。
上面紫色底纹的文字,是我暂时没有办法解决的,原因是Linux核心库glibc其中的libresolv.so.2文件中缺少res_nclose这样的函数符号。可能也是Ubuntu团队的原因没有编译这个函数符号,解决方法是在Linux的所有发行版的glibc库中寻找到libresolv.so.2这个动态链接库,然后同样放在类似
~/Develop/Qt5.5.0Beta/5.5/gcc_64/lib
这样的目录,但是截止我写博客的时候,我仍然没有找到合适的动态链接库。