基於Cmake+QT+VS的C++項目構建開發編譯簡明教程

来源:https://www.cnblogs.com/JoyPoint/archive/2019/03/17/10549774.html
-Advertisement-
Play Games

基於Cmake、QT Creator、Visual Studio的C++項目構建、開發、編譯是初學者必要的工具,本文主要介紹這些工具的下載與安裝,以及C++及Qt項目構建,主要包括 1.基於VS構建Qt項目;2.基於Qt Creater構建,在VS中開發Qt Creater生成的項目;3.基於Cma... ...


目錄

一、工具下載與安裝

1.     Qt

2.     Visual Studio 2015

3.     Cmake

二、C++及Qt項目構建

1.     基於VS構建Qt項目

2.     基於Qt Creater構建,在VS中使用

用Qt Creater構建項目

用VS開發Qt Creater生成的項目

3.     基於Cmake構建

用CMake-Gui構建

用批處理方式進行Cmake構建項目

 ===========================================

簡介

目前項目是儘量利用開源項目為基礎,考慮到跨平臺,以及後期便於開發的協同和延續,開發語言基於C/C++、UI基於QT(5.7.1),集成開發環境(IDE)使用Visual Studio(2015),開發階段基於Windows(WIN10)操作系統(32位 or 64位,如果記憶體大於4G,建議選64位),項目構建工具使用Cmake。

一、工具下載與安裝

1.  Qt

  • 安裝
    • 步驟省略(建議使用預設安裝即可,包括路徑應該在C盤,安裝路徑不要包含中文)
  • 配置
    • 在系統路徑中添加Qt bin路徑(如“;C:\Qt\5.7.1\5.7\msvc2015\bin”),

2. Visual Studio 2015

  • 下載
    • Visual Studio IDE、代碼編輯器、VSTS 和應用中心:

    https://visualstudio.microsoft.com/zh-hans/

    • 下載 | IDE、Code 和 Team Foundation Server:

    https://visualstudio.microsoft.com/zh-hans/downloads/

    • 下載舊版 Visual Studio 軟體:

 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

  • 安裝
    • 步驟省略(建議使用預設安裝即可,包括路徑應該在C盤;同時,需要將與Windows C/C++開發有關的Tools、SDK都選中,否則,後續用CMake生成VS工程時,可能出現錯誤)
  • 配置
    • 打開VS,選擇【工具】-【擴展和更新】,搜索“qt”,在結果中選擇“Qt Visual Studio Tools”,下載安裝後,在VS菜單中增加了【Qt VS Tools】。然後選擇【QT VS Tools】-> 【Qt option】,添加Qt版本,名稱“Qt5.7.1”,路徑“C:\Qt\5.7.1\5.7\msvc2015\”。

3. Cmake

  • 簡介
    • CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是 CMake 的組態檔取名為 CmakeLists.txt。Cmake 並不直接建構出最終的軟體,而是產生標準的建構檔(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects / workspaces),然後再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標準的方式建構自己的軟體。CMake 支持 in-place 建構(二進檔和源代碼在同一個目錄樹中)和 out-of-place 建構(二進檔在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進檔。CMake 也支持靜態與動態程式庫的建構。“CMake”這個名字是“cross platform make”的縮寫。雖然名字中含有“make”,但是CMake和Unix上常見的“make”系統是分開的,而且更為高階。作為跨平臺構建工具,CMake的創建是為了響應由NLM資助的Insight Segmentation and Registration Toolkit(ITK)的強大的跨平臺構建環境,作為Visible Human Project的一部分。它受到Ken Martin和其他開發人員創建的早期系統pcmaker的影響,以支持Visualization Toolkit(VTK)開源3D圖形和可視化系統。最初的CMake實施是在2000年中期,加速開發發生在2001年初。許多改進是由於其他開發人員將CMake納入他們自己的系統的影響。例如, Brad King添加了一些功能以支持CABLE,自動包裝環境和GCC-XML,以及GE Corporate R&D需要對其測試基礎架構(DART)的支持。添加了其他功能以支持VTK的構建環境向CMake的過渡,並支持ParaView,一個並行可視化系統,以支持洛斯阿拉莫斯國家實驗室的高級計算實驗室。
    • CMake官方文檔CMake Tutorial:http://www.cmake.org/cmake/help/cmake_tutorial.html
    • 下載Windows win64-x64 Installer
    • 地址:https://cmake.org/download/
  • 安裝
    • 步驟省略(建議使用預設安裝即可,包括路徑應該在C盤)
  • 配置
    • 將Cmake安裝路徑及bin路徑“c:\cmake3;c:\cmake3\bin”添加到系統PATH中;
    • 併在系統變數中增加變數名:“CMAKE_PREFIX_PATH”,變數值:“C:\Qt\5.7.1\5.7\msvc2015”。

二、C++及Qt項目構建

1. 基於VS構建Qt項目

  • 打開VS,新建項目,在模板中選擇“Qt”,選擇“Qt Gui Application”,項目名稱“QtGuiDemo”,解決方案同名,設置項目路徑(建議新建,不使用中文命名的文件夾),確定。

  • 根據嚮導,選擇新項目需要載入的Qt模塊,其中Core、GUI、Widgets為預設載入,下一步。

  • 選擇生成項目的基類“QMainWindow”,其他需自動生成的文件均用預設名稱,Finish。

  • 生成解決方案,自動生成了相關源文件,main.cpp、QtGuiDemo.h、QtGuiDemo.cpp、QtGuiDemo.qrc、QtGuiDemo.ui,在解決方案視窗可見項目文件結構。

  •  在項目目錄中生成的文件結構:

  • main.cpp
#include "QtGuiDemo.h"
#include <QtWidgets/QApplication>
 
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QtGuiDemo w;
  w.show();
  return a.exec();
}
  •  QtGuiDemo.h
#pragma once
 
#include <QtWidgets/QMainWindow>
#include "ui_QtGuiDemo.h"
 
class QtGuiDemo : public QMainWindow
{
  Q_OBJECT
 
public:

QtGuiDemo(QWidget *parent = Q_NULLPTR);
private:

Ui::QtGuiDemoClass ui;
};
  • QtGuiDemo.cpp
#include "QtGuiDemo.h"
 
QtGuiDemo::QtGuiDemo(QWidget *parent)
  : QMainWindow(parent)
{
  ui.setupUi(this);
}

2.基於Qt Creater構建,在VS中使用

  • 用Qt Creater構建項目

    • 打開Qt Creater,新建項目。添加項目名稱及路徑。

    • 選擇編譯套件。

    •  指定源碼文件基本信息。

    •  生成。

 

  • main.cpp
#include "qtguidemo.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtGuiDemo w;
    w.show();
    return a.exec();
}
  • QtGuiDemo.h
#ifndef QTGUIDEMO_H
#define QTGUIDEMO_H
#include <QMainWindow>
namespace Ui {
class QtGuiDemo;
}
class QtGuiDemo : public QMainWindow
{
    Q_OBJECT
public:

explicit QtGuiDemo(QWidget *parent = 0);
~QtGuiDemo();
private:

Ui::QtGuiDemo *ui;
}
#endif // QTGUIDEMO_H
  • QtGuiDemo.cpp
#include "qtguidemo.h"
#include "ui_qtguidemo.h"
QtGuiDemo::QtGuiDemo(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QtGuiDemo)
{
    ui->setupUi(this);
}
QtGuiDemo::~QtGuiDemo()
{
delete ui;
}
    • 可以觀察VS和Qt Creater生成的代碼區別。

 

  • 通過VS或Qt Creater編譯後,生成的界面。

  • 用VS開發Qt Creater生成的項目

    • 打開VS,選擇【Qt VS Tools】,選擇【Open Qt Project File(.pro)】,項目打開後即可直接修改、編譯。

3.基於Cmake構建

  • 用CMake-Gui構建

    • 新建目錄“CmakeQtGuiDemo”,將用Qt Creater生成的QtGuiDemo項目中的源文件複製進來,其中包含main.cpp、qtguidemo.cpp、qtguidemo.h、qtguidemo.ui;
    • 在該目錄中新建一個以“CMakeLists.txt”命名的文本文件,用記事本編輯即可,其內容如下:
1.#設置cmake版本號
2.cmake_minimum_required(VERSION 3.4.0)
3. 
4.#設置工程名稱
5.project(QtGuiDemo)
6. 
7.#設置工程包含當前目錄,非必須
8.set(CMAKE_INCLUDE_CURRENT_DIR ON)
9. 
10.#打開全局moc,設置自動生成moc文件,一定要設置
11.set(CMAKE_AUTOMOC ON)
12.#打開全局uic,非必須
13.set(CMAKE_AUTOUIC ON)
14.#打開全局rcc,非必須,如需打開,註意修改33行的qrc文件名
15.#set(CMAKE_AUTORCC ON)
16.
17.#查找需要的Qt庫文件,最好每一個庫都要寫,Qt也會根據依賴關係自動添加
18.find_package(Qt5Widgets) 
19.find_package(Qt5Core)
20.find_package(Qt5Gui)
21.
22.#查找當前文件夾中的所有源代碼文件,也可以通過Set命令將所有文件設置為一個變數
23.FILE(GLOB SRC_FILES "./*.cpp")
24.#查找設置當前文件夾中所有的頭文件
25.FILE(GLOB HEAD_FILES "./*.h")
26.#查找設置當前文件夾中所有的ui文件
27.FILE(GLOB UI_FILES "./*.ui")
28.
29.#通過Ui文件生成對應的頭文件,一定要添加
30.qt5_wrap_ui(WRAP_FILES ${UI_FILES})
31.
32.#添加資源文件,非必須,一旦採用,註意修改相應的qrc文件名
33.#set(RCC_FILES rcc.qrc)
34.
35.#將ui文件和生成文件整理在一個文件夾中,非必須
36.source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )
37.
38.#創建工程文件
39.add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${RCC_FILES} ${WRAP_FILES})
40.
41.#添加Qt5依賴項
42.target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui)
    • 運行CMake-Gui,在“Where is the Source code”和"Where to build the binaries"中均輸入本地項目目錄“C:\QtTest\CmakeQtGuiDemo”,可選擇內部編譯,即在同一目錄中生成項目,目的在於後期在引用lib中的頭文件或庫文件時不需另外操作,不好的地方就是源文件和目標文件混雜,如果想要在源文件外部編譯,可在"Where to build the binaries"中輸入目標路徑“C:\QtTest\CmakeQtGuiDemo_build”,後期再將源文件中頭文件和庫文件拷貝至目標文件夾對應的Lib中。(個人項目建議選外部編譯);

    • 勾選"Grouped"和"Advanced",便於列表項彙總擴展顯示;點擊"Configure"按鈕,彈出生成環境選項,在此根據目標選擇64位還是32位編譯,此例中選擇"Visual Studio 14 2015",並選中"Use default native compilers"用預設編譯器,點擊"Finish"按鈕,進行安裝配置

    • 經過短暫的等待,有可能會在視窗中出現若幹紅色選項,再次點擊"Configure"按鈕繼續生成,如還有紅色選項出現,不需其他操作,繼續"Configure",直到無紅色選項,點"Generate"按鈕,生成VS2015的解決方案等文件,提示"Generating done";

    • 用VS2015打開該解決方案即可進行繼續開發了。因為是目錄外構建,源文件並不在此目錄中,但在VS中可以直接打開源文件進行編輯和保存。

  • 用批處理方式進行Cmake構建項目

    在項目開發初期,會因為各種配置或代碼問題,需要經常進行CMake,每次都用CMake-Gui執行會比較麻煩,在此,可以利用批處理方式執行CMake項目構建。以CMakeQtGuiDemo項目為例。

    • 在此項目源文件目錄下,新建cmake_build_vs2015_project.bat文本文件(該文件要求必須在項目源文件目錄下,即與項目CMakeLists.txt文件同目錄下),其內容如下(rem為註釋):
@echo off

rem 獲取項目CMakeLists.txt文件所在目錄
set CURRENT_CMAKE_DIR=%~dp0

rem 獲取項目CMakeLists.txt文件所在目錄的名稱,用於新建構建目錄
for /f "delims=" %%i in ("%cd%") do set CURRENT_DIR_NAME=%%~ni

rem 到項目CMakeLists.txt文件所在目錄的上級目錄
cd..

rem 獲取當前目錄,%cd%與%~dp0的區別在於獲取的目錄尾部少了“\”
set CURRENT_DIR=%cd%

rem 設置需要外部構建的目錄名稱,在源文件目錄後面加“_build”
set PROJECT_NAME=%CURRENT_DIR_NAME%_build

rem 設置外部構建的完整路徑
set CURRENT_NEW_DIR=%CURRENT_DIR%\%PROJECT_NAME%
echo Cmake in [%CURRENT_NEW_DIR%]

rem 判斷是否已經存在外部構建的路徑,如果存在刪除
if exist %CURRENT_NEW_DIR% (
    rd /s/q %CURRENT_NEW_DIR%
)

rem 新建外部構建目錄
mkdir %CURRENT_NEW_DIR%

rem 進入新建的外部構建目錄,用於Cmake生成項目文檔
cd %CURRENT_NEW_DIR%

rem 根據編譯環境需要設定VS版本,%CURRENT_CMAKE_DIR%用於指定CMakeLists.txt所在目錄,-G 用於指定makefile的生成工具
::cmake ../ -G "Visual Studio 14 2015 Win64"
::cmake ../ -G "Visual Studio 14 2015 ARM"
cmake %CURRENT_CMAKE_DIR% -G "Visual Studio 14 2015"

cd..

rem 查看構建項目的目錄樹
tree %CURRENT_NEW_DIR% /f

pause
    • 運行cmd(或VS開發人員命令提示視窗),進入命令提示符視窗,定位到cmake_build_vs2015_project.bat所在目錄,並執行。
    • 用批處理方式生成的項目與用Cmake-Gui生成的項目是一樣的,用VS2015打開該解決方案即可進行繼續開發了。
    • 為什麼需要CMake構建項目,主要是在實際項目中,經常會用到多個第三方庫,或複雜項目結構,用Qt Creater(qmake)或VS構建,過程會變得很繁瑣,一旦設置有誤,就會出現很多編譯錯誤,特別是用VS載入第三方庫,因此,對簡單的Qt工程,採用 qmake或VS,對複雜度高的或需載入多個第三方庫的,採用cmake。
    • 本示例僅描述了簡單的CMake構建項目內容,更複雜的CMakeLists.txt文檔,需要在實踐中不斷總結完善,以形成項目需要的模板(可復用原則)。
  • 練習:在Qt目錄下找到Examples目錄,然後在widgets目錄中找到mainwindows\mdi項目,對其進行多種構建嘗試,並可以學習和掌握關於QMainWindow類及Gui開發的用法,同時,可以配合Qt助手進行進一步詳細學習各種類的用法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • datetime64 類型,你會用嗎?又如何在 numpy 中定義一個結構化數據類型呢? ...
  • GitHub代碼練習地址:1.兩種簡單get請求方法:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac13_requests1.py 2.帶請求頭與參數的get請求:https://github.com/Neo-ML/Py ...
  • 今天想做一個微博爬個人頁面的工具,滿足一些不可告人的秘密。那麼首先就要做那件必做之事!模擬登陸…… 關註公眾號「**Python專欄**」,後臺回覆「**模擬微博登陸**」,獲取全套微博自動登陸代碼。 ...
  • GitHub代碼練習地址:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac12_ajax.py 瞭解ajax 是一種非同步請求 一定會有url,請求方法,可能有數據 一般使用json格式 案例,爬取部分豆瓣電影排行榜, 代碼 ...
  • π的計算 一、π的簡介 π的介紹 圓周率用希臘字母 π(讀作pài)表示,是一個常數(約等於3.141592654),是代表圓周長和直徑的比值。它是一個即無限不迴圈小數,在日常生活中,通常都用3.14代表圓周率去進行近似計算。 π的求解歷程 1965年,英國數學家約翰·沃利斯(John Wallis ...
  • python中的猴子補丁Monkey Patch 什麼是猴子補丁 the term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent t ...
  • Java數據結構-HashMap 1. HashMap數據結構 沒有哈希衝突時,為數組,支持動態擴容 哈希衝突時,分為兩種情況: 1. 當衝突長度小於8或數組長度小於64(MIN_TREEIFY_CAPACITY預設值為64)時,為數組+鏈表(Node) 2. 當衝突長度大於8時,為數組+紅黑樹/鏈 ...
  • 作為一個有多年PHP開發經驗的碼農,我也是前段時間才發現PHP處理數組有這麼好用的函數, 至此之前,我處理數組的數據基本都是使用迴圈,記錄一下兩個函數的用法: array_column() 函數 返回輸入數組中某個單一列的值。 語法: array_column(array,column_key,in ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...