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


小北師兄作品

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

微信 ID: ncuneupa

由於排版原因,文章可能讀起來不太清晰,如果想看更好的排版,可以來我的公眾號:小北師兄


大家好,我是你們的小北師兄,由於工作原因,最近師兄在自學 Qt 相關知識,說起來師兄在校期間是研究算法的,一般都是純 C++ 來實現

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

下面進入正題,使用過 Qt 的都知道,我們一般建立一個 Qt 工程,都是在 Qt Creator 中根據向導進行建立,這樣比較方便,師兄根據之前使用 CMake / Gcc 的經驗,所以對 Qt 的編譯過程感興趣,這樣以后出了問題,即使不上網,也可以根據自己的理解,找到問題所在

師兄在網上找到了一個參考資料“Qt Creator 快速入門”,(關注公眾號,后台回復 "Qt" ,就可以獲取這個資料的電子版及源碼)。

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

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


文章目錄

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM