我的環境是windows,QT6.3.2(msvc2019_64/mingw_64)
出錯原因
? ? ? ? QT沒有正確加載OpenSSL。
解決過程
1、確保安裝的有openssl。
? 文章結尾有個注意,是其他方式安裝過openssl,環境變量有,但是QT找不到的問題。
? ? ? 在我這次使用的時候,沒有單獨去安裝OpenSSL,因為我在QT的下面路徑找到了需要的庫。
????????????????
? ? ? ? 我不太確定這是我安裝QT時特意選的,還是默認就有,反正如果沒有,盡量到官網下載,因為結尾的注意會討論這個事。
2、解決方法
方法一:
? ? ? ? 把上述文件復制到你所使用版本QT的下面路徑下:
????????注意你使用的是mingw_64就往這復制,使用的msvc2019就往對應的文件夾復制
復制完應該就可以用了。
方法二:
? ? ? ? 將上面找的的文件所在地址添加到環境變量
注意添加完,需要確定環境變量,然后重新啟動QTcreator才能生效。
不要急,等一下下,不行再重啟試試。
我下面是刪掉環境變量的實驗結果,(實驗代碼在下面),左邊是打開馬上運行的結果,他找到了!!!但是環境變量被我刪了!!!不應該找到啊!!!
我差點以為寫這么半天做了無用功,結果我看了一下他項目里用到的環境變量,并沒有啊,然后我又運行了一下,?他又沒找到,而且自己單開了一個輸出頁面,不理解。反正結果是對的。
驗證是否成功
#include <QSslSocket>
#include <QDebug>int main() {qDebug() << "OpenSSL supported:" << QSslSocket::supportsSsl();qDebug() << "OpenSSL runtime version:" << QSslSocket::sslLibraryVersionString();return 0;
}
直接把上面這段放在main.cpp運行。
注意上述結果雖然寫了個true,但是沒成功調用OpenSSL,而是調用Channel。我這個true是因為寫教程的時候環境改了又改,有點混亂了,如果沒有使用什么辦法的話,它可能顯示false,不影響,反正后面顯示的實際使用了Secure Channel, Windows。
Qt 默認優先使用 OpenSSL 來處理 HTTPS 請求。如果無法加載 OpenSSL 的動態庫(libssl.dll 和 libcrypto.dll),Qt 會嘗試使用其他可用的 TLS 后端(如 Windows 的 SChannel 或 macOS 的 SecureTransport)。
其實如果你不介意使用 Windows 的 SChannel 而不是 OpenSSL,并且程序運行正常,可以選擇忽略這條警告信息。
我一開始就是不懂,看起來好像功能實現了,但是它在最開始報了這個警告。就是下面這樣。
這就是使用SChannel實現了功能。
如果環境弄成功了,應該是下面的結果:
如果上面的方法沒有成功,可能是OpenSSL版本問題,可能與QT不對應,自行百度下。
遇到的一個問題
注意:遇到另一個問題就是我最初發現我的電腦里有OpenSSL,并且添加了環境變量,但是無法使用。
在終端輸入命令openssl version獲得的openssl不一定可用
上述是我在我電腦里找到的,一開始以為有,能夠用命令搜到其實應該是添加了環境變量,我一開始沒反應過來,又手動添加了一次,發現不能用。根據文件夾名稱可以看到,我是安裝strawberry的時候帶的,我其實都忘了這個strawberry拿來干啥的了。。。?
一開始以為是因為他是.exe執行文件所以不行,但是打開目錄發現他有那兩個動態庫:
?而且都是x64的,注意這個也是個點,沒有x64就代表是32位的,至于是不是所有版本QT都是用64位的,這需要自己去找了。
一開始我以為通過其他東西附帶的這種方式下載的不全,用不了。
后面我思考了一下,應該是版本不行的問題。
真正要注意的來了:
想著送佛送到西,為了驗證是不是版本問題,結果整出很多事。
結論:
? ? ? ? 1、QTcreator里面找到的高版本就按前面說的來,就沒問題,理論官網下的應該也沒問題。
? ? ? ? 2、重點是后面分析的strawberry問題,strawberry里的那2個庫文件名字中帶了2橫杠,把strawberry里的2個文件的最后的2個橫杠刪掉復制到方法一的位置(例:F:\Qt\6.3.2\mingw_64\bin),注意strawberry文件里的文件名不變。或者是strawberry文件里那2個文件刪掉2橫桿,復制給方法一里面的不刪。反正就是strawberry文件夾里和(例:F:\Qt\6.3.2\mingw_64\bin)里,一個帶橫杠一個不帶,但必須2個都有,很怪,但確實是這樣。反正這樣弄完他確實是strawberry里面的版本。。。。。。要用這個方法的,就是電腦里其他什么東西下載過openssl的,建議選擇在(例:F:\Qt\6.3.2\xxxx_64\bin)里面修改文件名,原路徑不動,避免影響其他程序。還有試了這個復制文件的方法與環境變量無關。
? ? ? ? ?3、就是建議QT里面沒有openssl庫的,去官網重新下吧,雖然我無意找到了其他地方存在openssl庫,然后能讓QT使用的方法,但是會改文件名,不太清楚會對原本的程序有什么影響,所以我最后就沒去動strawberry,還是使用的QT里面找到的版本。
下面是部分心路歷程,本來是要寫過程的,結果越來越匪夷所思,懶得寫了。
上面不是提到我安strawberry里面順帶安裝了openssl嗎,但是不能用。我把他們復制到QT里去試一下,不用環境變量的方式。還好我為了嚴謹,把VC和GW文件夾都試一遍,VC復制完,運行不成功,結果復制到GW的時候我復制錯地方,復制到QTcreator下面,就是找到能用open SSL動態庫的地方,我一下警覺,他沒有給我報重復文件的提示,我再想是不是之前被我剪切了,結果沒有,然后我仔細對比了文件名,,,strawberry里的多了2個橫杠,因為安裝straw時他自己添加過環境,所以我把名字里的橫杠去掉后,直接運行驗證代碼:
?到這以為成功了,結束了,結果才是詭異的開始,太復雜,懶得寫了。。。