解決Linux下Qt程式報『QString::arg: Argument missing: 無法解析SSLv2_client_method中的符號』錯誤,sslprotocolsslv2
解決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
這樣的目錄,但是截止我寫部落格的時候,我仍然沒有找到合適的動態連結程式庫。