開發Qt程序時,為什么是CMake?
什么是CMake?
CMake 是一個跨平臺的構建工具,用來管理 C/C++ 項目的編譯過程。它通過讀取 CMakeLists.txt 配置文件,自動生成適合不同操作系統和編譯器的構建腳本(比如 Makefile 或 Visual Studio 項目),讓開發者只需寫一次配置,就能在各種環境下編譯代碼。簡單說,CMake 幫你省去了手動寫復雜編譯命令的麻煩。
QMake(由.pro文件組織起來的編譯結構)和CMake(由CMakeLists.txt組織起來的編譯結構)實際上都是類似的,都是由一個腳本組織整個編譯過程,而且都是使用自己的方式簡化了整個編譯過程。
為什么是CMake?
我只說三個原因:
一、Qt Group事實上已經放棄了QMake作為官方的編譯工具,僅保留維護更新
二、CMake是大部分C++庫編譯腳本的事實標準
三、VS對QMake的支持幾乎為零,Qt + VS的Qt插件支持,但是這個插件也幾乎停止更新了。CMake有VS的支持。
我可以列出一大堆CMake比QMake更優越的理由,但是工程中使用CMake只需要上面三個理由就好了。
如何編譯CMake的項目
一般情況下,需要在項目文件夾最頂層找到一個CMakeLists.txt,這個編譯腳本通常是最頂層的腳本,控制整個編譯鏈。
一個項目里通常由很多個CMakeLists.txt組成的,通常情況是由最上層的一個CMakeLists.txt作為父項目,通過類似add_subdirectory等方法,控制其余多個子項目的編譯。
可以使用命令cmake … 等方式編譯,我這里展示使用CMake Gui Tool 編譯
一般情況,你在上面Where is the source code :中找到一個帶有CMakeLists.txt的路徑,然后在Where to build the binaries中,把上面的路徑copy下來,然后在后面加上一個build文件夾就好了,這樣這個項目的所有內容都會編譯到這個build文件夾里面來。
如果是第一次編譯,可能會彈窗,比如
這里提示是build文件夾不存在是否創建一個,這里點yes創建。
這里第一行是向你詢問使用什么生成工具,換句話說就是你想使用哪個IDE對項目進行編譯和管理,這里
支持的IDE還挺多的,但是我這里選擇使用Visual Studio 2022 編譯,誰會拒絕宇宙第一IDE呢?
第二行問的是目標框架,我們由于是在Windows上開發,所以不用選,默認是x64,如果需要交叉編譯一些特殊架構的,那你會知道你為什么要選這個,這里我們不選。
第三行問的是有沒有一些特殊的參數,不知道的話就是沒有
下面四個按鈕如果你不知道什么意思就也不用選。
這里點Finish 就可以了。
點擊Finish之后,就開始配置CMake項目了,如果參數檢查一切正確,那么就會出現Configuring done(xx s)的字樣,爆紅可能是一些warning而不是error,如果出現Configuring失敗,則需要檢查具體的error,具體問題具體分析。
比較常見的問題是由于環境變量的問題,上方的變量并沒有正確配置,你可以選擇手動在CMake Gui Tool 里面手動配置,也可以選擇在環境變量里面配置。
這里Configuring Done之后,就可以點Generate了,一般Configure成功Generate不會失敗,Generate Done之后,就可以在build文件夾里找到對應的項目管理文件sln了。雙擊打開,進入VS的CMake項目中。
如何在VS中管理CMake項目
生成sln 之后,點開你可能會看到一個ALL_BUILD和一個ZERO_CHECK,這兩個項目不用管,相當于是VS為了自己管理CMake而添加的兩個默認項目。
-
如果你編譯ALL_BUILD,那么他會自己去編譯所有項目
-
ZERO_CHECK的功能是用于??監控 CMake 配置文件的變更??并自動重新生成構建系統。
你每個項目內,控制其項目文件的唯一途徑是修改CMakeLists.txt,所以請不要像正常使用VS那樣將頭文件和CPP文件拖動進來。而是先修改CMakeLists.txt,然后再右鍵它,菜單欄找到編譯,VS會自動幫你生成一個新的項目覆蓋到原來的,并且會提示你文件已被覆蓋是否重新進入項目。
常見問題
使用CMake 編譯Qt的常見問題主要有兩個
1. Qt的系統變量配置有問題
CMake編譯 Qt需要一個這樣的環境變量:
需要落位到Qt/版本號/編譯器類型/lib/cmake/Qt6 文件夾下
2. Qt的某個庫的路徑找不到,CMake的Configure失敗
這里的一些路徑可能會出現 NOT-FOUND的情況,暫時不知道是為什么,如果找不到路徑,你需要做兩件事:
-
你在其他成功的找到路徑的DIR復制下來,把下面名字改一下,假設是這個Qt6LinguistTools_DIR的路徑找不到了,你從上面復制一個D:/Devtools/Qt/6.8.0/msvc2022_64/lib/cmake/Qt6Gui下來,把這個Qt6Gui改成Qt6LinguistTools試試先。
-
如果再次Configure仍然NOT-FOUND,需要確認這個工具是否存在,比如這里有一些和QMultiMedia有關的依賴,但是你的Qt并沒有安裝QMultiMedia的組件,這個可能會導致這個問題。