1. 程式人生 > >QT 編譯通過但是執行出現程式異常結束或者crashed的問題 在QT creator中最佳解決辦法

QT 編譯通過但是執行出現程式異常結束或者crashed的問題 在QT creator中最佳解決辦法

1 問題描述

重灌了系統,然後,下了最新的qt的環境,然後嘗試跑最基本的qt自帶的例項,發現錯誤。已經數次遇到這種情況了。

用了網上的一些方法,發現總是隻能解決一次問題,換了一個系統或者版本編譯器,結果又要重新搞一遍,好煩啊,

沒有個一勞永逸的方法了嗎?不服啊,今天研究了一下。

1.1 環境如下:

A WIN7 64位

B QT Creator

Qt Creator 4.5.0-rc1 (4.4.83)
Based on Qt 5.10.0 (MSVC 2015, 32 bit)

Built on Nov 21 2017 13:40:46

From revision 59e3d9af1e

Copyright 2008-2017 The Qt Company Ltd. All rights reserved.

The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

C QT的安裝版

QT 5.9.3 QT5.6.3 這兩個安裝版本

1.2 出現錯誤的環境配置如下:





1.3 主要懷疑的問題點:

a 沒有安裝Visual station 版本,

主要懷疑有一些QT的編譯器依賴於VS,這一題,其實可以PASS,因為QT也自帶了編譯器。 那麼,還有一個可能就是,作業系統和編譯器的相容性問題。 因為WIN7我裝的是64位的,那麼好了,QT自帶的MigGW是32位的會不會有問題呢? 重大嫌疑? 我於是去網上找單獨的MigGW的編譯器,遺憾的告訴大家,這個編譯器居然只有32位版本的。 網上,查到,大家都提到,其實32位編譯器編譯的程式在WIN7 64位上是可以使用的,這樣就搞的有點疑惑想要試驗一下。

b 動態庫的路徑不對

c 程式連線的庫路徑不對

這個問題的確認 ,通過編譯QT自帶的程式可以來驗證,所以這一條PASS

d 編譯器不匹配

這個問題QT creator有清除的功能,我們編譯器前先清除之前的東西,所以,這一題PASS.

e 不同版本的庫,不匹配

由於我下載了兩個QT的編譯器(相容性考慮)那麼很有可能,會出現編譯器的選擇的庫的版本不相容的問題。

2 解決的方法嘗試和步驟

根據上面1.3的分析,主要針對可能的問題 1.3.a 、1.3.d和 1.3.b來進行評判。

2.1 嘗試安裝VS2015,來移除64位作業系統的影響(嘗試解決1.3.a的問題)

微軟的 VS2015在社群的集合版本里面其實已經可免費下載了,所以,沒有問題,我們可以先嚐試一下VS2015,這樣,也許環境問題就可以解決了。

https://www.visualstudio.com/zh-hans/downloads/?rr=http%3A%2F%2Fblog.csdn.net%2Fliang19890820%2Farticle%2Fdetails%2F53931813


2.2 嘗試直接從生成的可執行檔案執行獲取應用實際的錯誤資訊(嘗試解決1.3.b的問題)


通過在作業系統的陸經理嗎增加QT路徑可以找到Qt5Core.dll的丟失問題。


我增加的路徑如下:

D:\QT\Tools\QtCreator\bin

但是,還是有如下報錯繼續出現:


這時候只能是把Qt5Core.dll拷貝到windows/system32下面去了

然後,重新啟動機器,發現這個問題最終解決了。但是,當我換了其他一個專案的時候,我發現,這種copy到windows的目錄的方法就不好了,

因為,新的專案程式,依然要有同樣的動態庫找不到的問題,同樣執行後,出現庫的不匹配問題。

2.3 如何徹底解決庫的丟失問題?(嘗試解決1.3.d的問題)

之前的路徑設定都是可以解決某一次的庫問題,但是,對於有些苦,不同QT其實有不同的版本。 這時候,就需要設定路徑的時候,依據專案考慮優先選擇庫的版本。 那麼,如何選擇庫的優先版本呢?
其實,我們不一定非要去設定系統的環境變數, 我們知道QT creator其實有專案設定的 如上圖, 在QT creator的專案設定欄目裡面,有構建環境的相關設定,其中就包括,PATH, 這個PATH顯然是優先順序高於系統的環境變數的設定的,

然後,我們需要注意把本專案用的編譯器的路徑放到最前面,這樣,系統會先找這個路徑相對庫,編譯生成新的需要的庫檔案等。