一個例子讓你秒懂 Qt Creator 編譯原理

小北師兄做品算法

首發於微信公衆號 小北師兄微信

微信 ID: ncuneupa測試

因爲排版緣由,文章可能讀起來不太清晰,若是想看更好的排版,能夠來個人公衆號:小北師兄ui


你們好,我是大家的小北師兄,因爲工做緣由,最近師兄在自學 Qt 相關知識,提及來師兄在校期間是研究算法的,通常都是純 C++ 來實現命令行

當時電腦環境以 Linux 發行版 Ubuntu 爲主,到了工做中就轉向了 Windows,剛開始確實有一些不太習慣,在 Windows 上配置環境通常比較繁瑣,並且有些問題網上還不容易找到debug

下面進入正題,使用過 Qt 的都知道,咱們通常創建一個 Qt 工程,都是在 Qt Creator 中根據嚮導進行創建,這樣比較方便,師兄根據以前使用 CMake / Gcc 的經驗,因此對 Qt 的編譯過程感興趣,這樣之後出了問題,即便不上網,也能夠根據本身的理解,找到問題所在3d

師兄在網上找到了一個參考資料「Qt Creator 快速入門」,(關注公衆號,後臺回覆 "Qt" ,就能夠獲取這個資料的電子版及源碼)。code

這本書就簡單介紹了這個編譯過程,師兄根據資料上的說明,以及本身的試驗過程,對這個問題有了一個更深的理解。blog

小夥伴們不要失望,師兄寫這篇文章可不是直接照搬資料上的內容,相信小夥伴們通讀下來絕對會有收穫!圖片


文章目錄

1 Qt Creator 新建項目及編譯過程

2 命令行編譯:

1.1 用 Qt 自帶環境進行編譯

1.2 在 Cmd 終端中直接進行編譯

1.3 拓展

本機環境:Windows10 企業版 64 位 + QT5.9.9 + MinGw 5.30 32 位


1 Qt Creator 新建項目及編譯過

師兄這裏拿出資料上的一個例子(沒有 ui 文件的),咱們在 Qt Creator 建立一個 Empty qmake project (空項目),而後本身添加 C++ 文件 main.cpp,該源文件內容以下:

#include <QApplication>#include <QDialog>
#include <QLabel>int main(int argc, char **argv) {
    QApplication a(argc, argv);
    QDialog w;
    w.resize(400, 300);
    QLabel label(&w);
    label.move(120, 120);
    label.setText(QObject::tr("Hello"));
    w.show();
    return a.exec();
}

編輯 .pro 文件,添加 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 便可,而後編譯該程序,能夠看到編譯輸出結果以下圖 1 所示

img

圖 1 Qt Creator 編譯輸出結果

小夥伴請對圖片上紅色框起來的內容 mingw32-make 留個印象,下面還會用到這個。編譯完成後就可直接正常運行。

能夠看到,用 Qt Creator 建立項目/編譯運行項目很是簡單,幾步操做下來就能夠運行一個程序。


2 命令行編譯:

爲了瞭解 Qt Creator 背後爲你們作的工做,須要知道如何用命令行編譯這個程序。咱們先創建一個文件夾 2-2-2,而後將上面寫好代碼的 main.cpp 原封不動的拷貝到這個文件夾中,目前爲止,準備工做完畢,接下來進入正題。

在 Windows 中,須要打開 cmd 這個終端程序(定位到 2-2-2 目錄),而後按照以下命令便可編譯 Qt 程序,主要步驟以下:

  1. 調用 qmake -project 生成 .pro 文件,在該文件中添加 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets這句話
  2. 調用 qmake 生成 Makefile 文件和 debug / release 目錄等等,
  3. 調用 mingw32-make 讀取 Makefile 而後對代碼進行編譯連接(內部調用的是 gcc/g++ 編譯器),生成 .exe 文件到 release 目錄,默認的是 release 版本,若是想要 debug 版本,可使用 mingw32-make -f Makefile.Debug 這個命令來代替(下面會說如何知道的)

Note: 若是不知道到 qmake,以及 mingw32-make 都有哪些選項,可使用 --help 參數來查看,好比 qmake --help ,就會列出該命令一些選項參數介紹。

下面以兩種方法進行命令行編譯


1.1 用 Qt 自帶環境進行編譯

在電腦的菜單欄中找到 Qt5.9.9(MinGw 5.3.0 32-bit) 這個終端程序(對應到你本身的 Qt 版本便可,這個是 Qt 的運行環境),而後跳轉到你的工做目錄中,使用上面的命令便可。

1)打開電腦開始界面選擇 Qt5.9.9(MinGw 5.3.0 32-bit) 這個終端程序,以下圖 2 所示

img

圖 2 Qt 自帶環境終端

2)按照下圖 3,圖 4 方法進行操做便可

img

圖 3 終端運行命令及結果

這裏有兩點須要注意:

  1. 在使用 qmake -project 以後,須要在生成的 .pro 文件中進行 Qt 庫的包含,好比我這裏就須要添加greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 這一行代碼。

  2. 黃色畫線地方,在這個終端中,前面必須加上 /d 才能跳轉到對應的文件夾中,而後再用 qmake -project 便可生成 .pro 文件

繼續按照下圖 4 方式操做

img

圖 4 終端運行命令及結果

從參考資料上,只說了默認生成 .exe 在 release 文件夾中,沒有說明如何生成 debug 版本的 .exe 文件,因此我特地觀察了一下 mingw32-make 的輸出信息,從上圖的紅橫線部分能夠看到 mingw32-make -f Makefile.Release 是讀取 Makefile.Release 文件內容進行編譯的,結果輸出就會進入 release 目錄,因此我查看了 mingw32-make 的選項參數,發現 -f 是指定哪一個 Makefile 文件的,所以就得出mingw32-make -f Makefile.Debug 會輸出到 debug 目錄中,通過實驗驗證了。

以後經過鍵入以下命令 cd release &&``2-2-2.exe 就能夠正常運行程序了

3)咱們能夠大體看一下 Makefile 內容,以下圖 5 所示

img

圖 5 Makefile 文件內容

能夠看到 CC CXX 表示用了什麼編譯器,這裏用了 gcc/g++,連接器使用了 g++,等等,從這裏均可以看到編譯程序須要哪些庫以及編譯選項


1.2 在 Cmd 終端中直接進行編譯

Win + R 輸入 cmd 進入終端,跳轉到對應文件夾中,而後運行上述命令,但要注意,你必需要配置好系統的 PATH 環境變量才行,好比我本身配置的環境變量以下圖 6 所示

img

圖 6 本機系統環境變量配置信息

以後依次運行如下命令便可

qmake -project` 以後修改 .pro 文件,在運行下面命令,`qmake && mingw32-make

cd release && 2-2-2.exe 便可運行程序


**
**

1.3 拓展

若是按照上面的方法來作,相信你們確定可以成功運行(師兄研究半天才得出的終極結論),可是師兄第一次實驗就沒有這麼幸運了,走了好多彎路,下面師兄就把本身遇到的問題,中間思考過程以及最終結論一一說明

若是大家用過 Qt 開發過界面程序,那麼確定遇到過相似下圖的問題:

img

圖 7 遇到的問題

師兄作這個實驗也遇到了這個問題,首先,師兄沒有使用 Qt 自帶的運行環境(哈哈 師兄當時多是飄了img,不過不飄就不會得出上面的終極結論分享給你們了,算了算仍是不虧的img),就直接打開了 cmd ,而後調用上面 qmake -project ,qmake,mingw32-make 直接一波操做操,心想,確定能夠直接運行了

沒想到現實 pia pia pia~,運行 .exe 時就出現了上面的提示,師兄當時就蒙了, QT 自帶環境也是在終端運行的啊,我也是在終端運行的啊,我在安裝 Qt 的時候也設置了環境變量了,爲何會出現這個問題呢?

想必你們也是跟師兄有着一樣的問題,先看一下這個問題,通常引發這個問題都是缺乏相應的 dll 結尾的動態連接庫,那麼好辦了,通過我這兩天對 Qt 的瞭解,還真的有一個解決方法,那麼就是用 Qt 自帶的部署程序 windeployqt ,經過這個程序就能夠將一些依賴自動複製到你的文件夾中了,而後在運行就會發現解決了,如圖 8 所示

img

圖 8 利用 windeployqt 程序運行結果

圖 8 中紅色框都是 windeployqt 部署程序生成的,會自動的把你的依賴所有拷貝過來,這種也是將本身的程序,放到沒有 Qt 環境的計算機上運行的必備操做。

到這裏你覺得就完了,不不不,還遠遠沒到,師兄以爲每次命令行編譯完成後都要部署一下才能運行太麻煩,說明這個方案不適用於日常的開發,只是一種可選擇方案,師兄以爲這個解決方案就用來發布程序就好了。

這又回到了問題的開始,還記得上面師兄說過這麼一句,師兄不用 Qt 自帶的環境,就在 cmd 命令行中直接鍵入相應的命令,以後纔出現了問題,那我們就順藤摸瓜,這個 Qt 環境與我本身直接在命令行中鍵入命令有什麼不同嗎?

打開計算機開始界面,找到 Qt 自帶環境的應用程序,以下圖 9 所示

img

圖 9 Qt 自帶環境探索結果

鼠標右鍵點擊 Qt5.9.9(MinGw 5.3.0 32-bit) 以後點擊「開文件位置」,獲得以下圖 10 所示

img

圖 10 Qt 自帶環境探索結果 2

能夠看到,這裏最終會調用一個 qtenv2.bat 的一個腳本文件,目標是:C:\Windows\System32\cmd.exe /A /Q /K D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin\qtenv2.bat,(這裏多說一句,咱們也能夠在啓動文件夾中仿照這種方法,執行本身的腳本文件,進而配置相應的環境),到對應文件夾下打開該文件,其內容以下圖 11 所示:

img

圖 11 qtenv2.bat 內容

能夠看到,這裏就設置了一下 PATH 的環境變量,師兄以前也在電腦上設置了環境變量,可是好像與這個有點不同,以下圖 12 所示,這是師兄最開始本身電腦的環境變量

img

圖 12 本機最開始的環境變量

通過仔細對比,師兄發現這裏多了一個 D:\Qt\Qt5.9.9\Tools\QtCreator\bin; ,且順序有一點不一樣,但也僅僅是多了這一個路徑而已,沒想到會出現這麼大的問題,師兄突發奇想,難道真的是多了一個路徑才形成這樣的結果嗎?若是填加了這個路徑,那麼順序變化會不會有影響呢?

接下來師兄就作了以下實驗,我直接將這個看似多餘的路徑給刪除了,也就是圖 6 所示,而後在 cmd 中進行 qmake && mingw32-make 命令,繼續運行 2-2-2.exe ,此時就會正常運行

到目前爲止,咱們找到了問題所在,也就是多出來的這個路徑形成的,相信你們到這裏仍是會有疑問,若是不去掉這個路徑還會出現這個問題嗎?

師兄又作了下面幾個實驗,分別設置了 PATH 的環境變量,僅僅順序不同,在 cmd 中設置一下環境變量順序,而且重新執行 qmake mingw32-make 命令,下面僅僅列出路徑的順序及對應結果,具體實驗結果圖就省略了:

set PATH=D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;%PATH%

結論:這個能夠運行

set PATH=D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;%PATH%

結論:能夠運行,說明 Tools/mingw530_32\ 和 5.9.9\mingw53_32 互換位置也能夠,它們兩個順序沒有影響

set PATH=D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;%PATH%

結論:不能夠運行,說明 Tools\QtCreator 路徑要在 5.9.9\mingw53_32 路徑後

set PATH=D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;%PATH%

結論:能夠運行,說明 Tools/mingw530_32 路徑能夠在 Tools\QtCreator\ 路徑後面

綜合上面實驗及其結果,師兄發現了一個有趣的現象,就是 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\binD:\Qt\Qt5.9.9\Tools\QtCreator\bin 的路徑順序是強相關的。能夠沒有 D:\Qt\Qt5.9.9\Tools\QtCreator\bin 這個路徑,若是在電腦的環境變量中添加了這個路徑,那麼這個路徑 D:\Qt\Qt5.9.9\Tools\QtCreator\bin 必需要在 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin 這個路徑後面。

相信你們還有一個疑問:D:\Qt\Qt5.9.9\Tools\QtCreator\binD:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin 路徑順序不一樣是如何形成這個問題的?

師兄結合本身的經驗,初步的想了一下,應該是 mingw32-make 在執行過程當中,會在系統的 PATH 路徑下找到一些東西來執行,剛好,剛剛那兩個路徑下都有「一樣」(或者可代替的)的東西

而後只有 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin路徑下的東西才能夠,師兄也分別查看了這個文件夾,很遺憾,以師兄的能力,仍是沒能找到這兩個路徑的哪些東西是"同樣的",若是有小夥伴知道這個緣由,但願能私信告訴師兄一下。

到這裏,這個問題基本上就算解決了,若是小夥伴有其餘理解,或者以爲師兄有哪些地方理解有問題,也能夠私信師兄哈

喜歡的小夥伴請動動大家可愛的小手,多多點贊!大家的支持爲我不斷寫出幹活文章提供源源不斷的動力!


推薦閱讀

《據說你安裝測試 OpenCV 老是不成功?你可能遇到這個坑了!

《反覆研究好幾遍,我才發現關於 CMake 變量還能夠這樣理解!

《安裝完 Ceres 庫,官方文檔就能扔掉嗎?這些潛在的知識你可能還不會!


來源 | 做者 小北師兄

編輯 | 小北師兄

如需轉載,請後臺留言

分享給朋友或朋友圈請隨意

- END -

以爲不錯?右下角「點我、點我、點我」img

相關文章
相關標籤/搜索