開發Qt程序時,為什么是CMake?

開發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而添加的兩個默認項目。

  1. 如果你編譯ALL_BUILD,那么他會自己去編譯所有項目

  2. ZERO_CHECK的功能是用于??監控 CMake 配置文件的變更??并自動重新生成構建系統。

請添加圖片描述

你每個項目內,控制其項目文件的唯一途徑是修改CMakeLists.txt,所以請不要像正常使用VS那樣將頭文件和CPP文件拖動進來。而是先修改CMakeLists.txt,然后再右鍵它,菜單欄找到編譯,VS會自動幫你生成一個新的項目覆蓋到原來的,并且會提示你文件已被覆蓋是否重新進入項目。

常見問題

使用CMake 編譯Qt的常見問題主要有兩個

1. Qt的系統變量配置有問題

CMake編譯 Qt需要一個這樣的環境變量:

test

需要落位到Qt/版本號/編譯器類型/lib/cmake/Qt6 文件夾下

2. Qt的某個庫的路徑找不到,CMake的Configure失敗

Test

這里的一些路徑可能會出現 NOT-FOUND的情況,暫時不知道是為什么,如果找不到路徑,你需要做兩件事:

  1. 你在其他成功的找到路徑的DIR復制下來,把下面名字改一下,假設是這個Qt6LinguistTools_DIR的路徑找不到了,你從上面復制一個D:/Devtools/Qt/6.8.0/msvc2022_64/lib/cmake/Qt6Gui下來,把這個Qt6Gui改成Qt6LinguistTools試試先。

  2. 如果再次Configure仍然NOT-FOUND,需要確認這個工具是否存在,比如這里有一些和QMultiMedia有關的依賴,但是你的Qt并沒有安裝QMultiMedia的組件,這個可能會導致這個問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912133.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912133.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web布局10

Grid 布局指的是 CSS Grid Layout ,它和以往 CSS 框架(CSS Framework)中所說的網格系統(Grid System)有所不同。至今為止,它是唯一一個具有二維能力的布局系統,即,它是一個基于二維網…

Spring AI 項目實戰(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司發票智能處理系統的技術實踐(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4

【FR801xH】Ubuntu24.04搭建富芮坤FR801xH系列開發環境教程

00. 目錄 文章目錄 00. 目錄01. FR801xH概述02. FR801xH特性03. gcc-arm-none-eabi-10.3-2021.10概述04. gcc-arm-none-eabi-10.3-2021.10下載05. gcc-arm-none-eabi-10.3-2021.10安裝06. FR801xH-SDK編譯07. 附錄 01. FR801xH概述 FR801xH 系列芯片是面向 SOC(片上…

Excel學習05

員工排班表 通過之前的學習,目前的我們已經具備了Excel的初步制作能力。接下來將從實際出發制作一個員工排班表。在制作排版表之前,先來看我們要用到的函數。 DATE函數 date函數是Excel中處理日期的核心函數之一,它能夠將單獨的年、月、日…

黑馬JVM解析筆記(五):深入理解Java字節碼執行機制

1.從字節碼的角度分析i /** * 從字節碼角度分析 a 相關題目 */ public class Demo3_2 {public static void main(String[] args) {int a 10;int b a a a--;System.out.println(a);System.out.println(b);} }a 和 a 實際上代表了兩個不同的操作,它們分別對應自增…

從社交媒體到金融“超級應用”,馬斯克X平臺將上線投資交易服務

報道稱,馬斯克旗下的X平臺將推出“超級App”,提供投資和交易服務,另外,X也在探索引入信用卡或借記卡。作為金融服務布局的第一步,X平臺已宣布將推出X Money——一項數字錢包和點對點支付服務,Visa將成為其首…

【入門第2課】Splunk數據接入

前言 Splunk支持多種多樣的數據源,比如它可以直接上傳文件,可以監控本地的任何目錄或文件,也可以配置通用轉發器等方式來完成數據接入。Splunk所有的設置都可以通過Web頁面、使用Splunk CLI命令,甚至是直接修改配置文件,以此來完成設置。 那么,如何接入數據呢?我們通過…

【數據挖掘】關聯規則算法學習—Apriori

關聯規則算法學習—Apriori Apriori算法是關聯規則挖掘中的經典算法,用于發現數據集中的頻繁項集和強關聯規則。其核心思想基于先驗性質:若一個項集是頻繁的,則其所有子集也一定是頻繁的。該算法通過逐層搜索的迭代方法高效挖掘關聯規則。 要…

助力高考,利用python獲取本專科專業選考科目要求

大家好,今天我們來利用python技術助力高考,獲取網上的本專科專業選考科目要求,用到的Python模塊有:Requests、Json、BeautifulSoup、Pandas ,主要思路是Requests獲取接口請求,利用BeautifulSoup 解析網站的…

Python 商務數據分析—— NumPy 學習筆記Ⅱ

一、 數組元素值的替換 我們可以使用索引或 where () 函數來替換 NumPy 數組中的元素值。 1.1 方式一:索引 import numpy as npnp.random.seed(42)a3 np.random.randint(0, 10, size(3, 4))print("原數組:\n", a3)a3\[1] 0 # 將a3數組第一行數據全…

遙感圖像語義分割1-安裝mmsegmentation

參考: mmsegmentation: 安裝并使用自定義數據集進行訓練_mmsegmentation安裝-CSDN博客 最新Windows配置安裝mmcv與mmsegmentation,以及mmsegmentation的驗證_mmcv安裝-CSDN博客 GitCode - 全球開發者的開源社區,開源代碼托管平臺 參考: …

【菜狗的記錄】模糊聚類最大樹、圖神經網絡、大模型量化——20250627

每日學習過程中記錄的筆記,從各個網站整理下來,用于當日復盤。 如果其中的知識點能幫到你,也很榮幸呀。 -------------------------------------------------------20250622------------------------------------------------------------- …

《短劇平臺開發指南:技術方案、核心功能與行業趨勢》

一、短劇行業現狀與系統開發價值 近年來,短劇市場呈現爆發式增長,成為數字內容領域的新風口。數據顯示,2023年國內短劇市場規模已突破300億元,用戶規模達到4.5億。這種以"短、平、快"為特點的內容形式,憑借…

[FPGA]嵌入式系統FPGA設計資源

嵌入式系統FPGA設計資源 一、供應商 https://www.altera.com- Altera FPGA 供應商網站 https://www.altera.com/events/northamerica/intel-soc-fpga-developer-forum/overview.html- SoC 開發人員論壇 https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/li…

ClickHouse 可觀測性最佳實踐

ClickHouse 介紹 ClickHouse 是一款高性能、列式存儲的開源分析型數據庫,專為在線分析處理(OLAP)場景設計。它能夠處理海量數據,支持實時查詢和復雜的數據分析,具備極高的讀寫性能和數據壓縮能力。ClickHouse 提供了強…

Android Framework設置時間為24小時制

文章目錄 定位源碼實現附錄12 小時制與 24 小時制的詳細解析一、基本定義與核心區別二、轉換方法與示例三、應用場景與文化差異四、延伸知識:特殊計時制與歷史背景 目的是把設置中使用默認語言區域關掉,并把使用24小時制打開 如下圖為原始的:…

基于STM32設計的掃地機器人

一、前言 1.1 項目介紹 【1】項目開發背景 隨著社會節奏的加快和人們生活方式的改變,智能家居產品逐漸走入千家萬戶。作為智能清潔系統的重要組成部分,掃地機器人憑借其自動化、高效性和便捷性,成為現代家庭中不可或缺的智能設備之一。傳統…

什么是接口測試?

2025最新Jmeter接口測試從入門到精通(全套項目實戰教程) 接口測試概念 接口測試是項目測試的一部分,它測試的主要對象是接口,是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與所測系統之間以及內部各系統之間的交…

JDY-23藍牙模塊與電腦的連接方式

JDY-23藍牙模塊支持多種連接方式,包括SPP(串口通信)模式和BLE(低功耗藍牙)模式。以下是與電腦連接的具體方法: 1. 通過SPP模式連接 JDY-23模塊支持SPP協議,可以通過串口與電腦通信。以下是連接…

【網絡】Linux 內核優化實戰 - net.core.rmem_max

目錄 參數作用與原理默認值與查看方法調整場景與方法適用場景調整方法 與其他參數的協同性能影響與注意事項典型案例總結 net.core.rmem_max 是 Linux 內核中控制 套接字接收緩沖區(Receive Buffer)最大允許值 的參數。它與 net.core.rmem_default&#…