https://www.jianshu.com/p/7eeb6f79a275 轉載自這里
用CMake來組織的工程中要用Qt首先要設置、找到Qt相關模塊。主要是通過find_package這個CMake命令。但網上很多教程都過時了,或者不夠清晰靈活。因為這部分很常用,所以特別用一篇文章把我們目前在生產環境中使用的方法給大家介紹下。
設置Qt庫路徑
Qt版本很多,我們的開發機上一般也裝有多個不同版本的Qt。個人嘗試性的項目一般用最新版的Qt,而真正發布的產品一般用的是LTS版本Qt(LTS:Long Term Support,長期支持版本,目前最新的LTS是5.9)。
我們的方法是在系統中添加多個環境變量。例如我電腦上裝有4個版本:Qt 5.9.4和Qt5.10.1的32位和64位庫。所以有4個環境變量:
| 環境變量名 | 值 |
|---|---|
| QTDIR594 | C:\Qt\Qt5.9.4\5.9.4\msvc2015 |
| QTDIR594_64 | C:\Qt\Qt5.9.4\5.9.4\msvc2015_64 |
| QTDIR5101 | C:\Qt\Qt5.10.1\5.10.1\msvc2015 |
| QTDIR5101_64 | C:\Qt\Qt5.10.1\5.10.1\msvc2015_64 |
然后在CMakeLists中添加:
set(CMAKE_PREFIX_PATH $ENV{QTDIR594})
通過在$ENV{}里選擇不同的環境變量就可以切換不同的Qt版本。
查找Qt模塊
網上很多CMake查找Qt方法都是過時的Qt4的方法。現在正確的、最新的方法是:
find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)
Components后面加的就是這個工程中會用到的Qt模塊,例如上面就用到了Core、Gui、Qml、Quick這幾個模塊,也是一般一個Qt Quick程序必須用到的幾個模塊。
打開相關自動選項
Qt Quick程序中的QRC資源文件需要用rcc來進行預處理,生成相應.h和.cpp文件。QObject派生的C++類也需要通過moc進行處理。這些都是編譯系統中所謂的Rules。CMake中通過打開下面兩個選項可以自動對這些后綴的文件進行相應處理:
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)
由於生成的C++文件都是放在編譯目錄里的(在Shadow Building中有別於源碼目錄),所以還需要將編譯目錄包含到Include目錄,否則編譯器會找不到這些頭文件:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
鏈接時設置相應模塊
最后一步是在鏈接的時候把用到的Qt庫寫上去:
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)
這樣就能鏈接上用到的Qt庫了。
完整的CMake例子
上面只是着重說明了CMake關於添加Qt模塊的代碼,一個完整的CMake例子肯定不止上面這些。下面就貼出一個完整的例子:
cmake_policy(VERSION 3.9) project(Demo VERSION 0.1) cmake_minimum_required(VERSION 3.9) set(CMAKE_CXX_STANDARD 11) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_PREFIX_PATH $ENV{QTDIR594}) find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED) set(HEADERS appglobal.h ) set(SOURCES main.cpp appglobal.cpp ) set(RESOURCES qml.qrc ) set(QMLS main.qml ) add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${RESOURCES} ${QMLS}) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)
當需求復雜之后CMake中還會有很多命令,這個以后我們介紹具體技術的時候再講。
作者:吉米有態度
鏈接:https://www.jianshu.com/p/7eeb6f79a275
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
自己寫的例子: cmake_minimum_required(VERSION 2.8) project(Demo) set(CMAKE_PREFIX_PATH /home/qilin64/Qt5.6.0/5.6/) set(CMAKE_CXX_STANDARD 11) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) file(GLOB_RECURSE SOURCES "*.cpp") file(GLOB_RECURSE HEADERS "*.h") file(GLOB_RECURSE FORMS "*.ui") file(GLOB_RECURSE RESOURCES "*.qrc") find_package(Qt5 COMPONENTS Core Gui Qml Quick Widgets REQUIRED) add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES}) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Widgets)
qt的模塊介紹 Qt 基礎模塊分為以下幾個: o Qt Core,提供核心的非 GUI 功能,所有模塊都需要這個模塊。這個模塊的類包括了動畫框架、定時器、各個容器類、時間日期類、事件、IO、JSON、插件機制、智能指針、圖形(矩形、路徑等)、線程、XML 等。所有這些類都可以通過 頭文件引入。 o Qt Gui,提供 GUI 程序的基本功能,包括與窗口系統的集成、事件處理、OpenGL 和 OpenGL ES 集成、2D 圖像、字體、拖放等。這些類一般由 Qt 用戶界面類內部使用,當然也可以用於訪問底層的 OpenGL ES 圖像 API。Qt Gui 模塊提供的是所有圖形用戶界面程序都需要的通用功能。 o Qt Multimedia,提供視頻、音頻、收音機以及攝像頭等功能。這些類可以通過 引入,而且需要在 pro 文件中添加 QT += multimedia。 o Qt Network,提供跨平台的網絡功能。這些類可以通過 引入,而且需要在 pro 文件中添加 QT += network。 o Qt Qml,提供供 QML(一種腳本語言,也提供 JavaScript 的交互機制) 使用的 C++ API。這些類可以通過 引入,而且需要在 pro 文件中添加 QT += qml。 o Qt Quick,允許在 Qt/C++ 程序中嵌入 Qt Quick(一種基於 Qt 的高度動畫的用戶界面,適合於移動平台開發)。這些類可以通過 引入,而且需要在 pro 文件中添加 QT += quick。 o Qt SQL,允許使用 SQL 訪問數據庫。這些類可以通過 引入,而且需要在 pro 文件中添加 QT += sql。 o Qt Test,提供 Qt 程序的單元測試功能。這些類可以通過 引入,而且需要在 pro 文件中添加 QT += testlib。 o Qt Webkit,基於 WebKit2 的實現以及一套全新的 QML API(順便說一下,Qt 4.8 附帶的是 QtWebkit 2.2)。 Qt 擴展模塊則有更多的選擇: o Qt 3D,提供聲明式語法,在 Qt 程序中可以簡單地嵌入 3D 圖像。Qt 3D 為 Qt Quick 添加了 3D 內容渲染。Qt 3D 提供了 QML 和 C++ 兩套 API,用於開發 3D 程序。 o Qt Bluetooth,提供用於訪問藍牙無線設備的 C++ 和 QML API。 o Qt Contacts,用於訪問地址簿或者聯系人數據庫的 C++ 和 QML API。 o Qt Concurrent,封裝了底層線程技術的類庫,方便開發多線程程序。 o Qt D-Bus,這是一個僅供 Unix 平台使用的類庫,用於利用 D-Bus 協議進行進程間交互。 o Qt Graphical Effects,提供一系列用於實現圖像特效的類,比如模糊、銳化等。 o Qt Image Formats,支持圖片格式的一系列插件,包括 TIFF、MNG、TGA 和 WBMP。 o Qt JS Backend,該模塊沒有公開的 API,是 V8 JavaScript 引擎的一個移植。這個模塊僅供 QtQml 模塊內部使用。 o Qt Location,提供定位機制、地圖和導航技術、位置搜索等功能的 QML 和 C++ API。 o Qt OpenGL,方便在 Qt 應用程序中使用 OpenGL。該模塊僅僅為了程序從 Qt 4 移植到 Qt 5 的方便才保留下來,如果你需要在新的 Qt 5 程序中使用 OpenGL 相關技術,需要使用的是 QtGui 模塊中的 QOpenGL。 o Qt Organizer,使用 QML 和 C++ API 訪問組織事件(organizer event)。organizer API 是 Personal Information Management API 的一部分,用於訪問 Calendar 信息。通過 Organizer API 可以實現:從日歷數據庫訪問日歷時間、導入 iCalendar 事件或者將自己的事件導出到 iCalendar。 o Qt Print Support,提供對打印功能的支持。 o Qt Publish and Subscribe,為應用程序提供對項目值的讀取、導航、訂閱等的功能。 o Qt Quick 1,從 Qt 4 移植過來的 QtDeclarative 模塊,用於提供與 Qt 4 的兼容。如果你需要開發新的程序,需要使用 QtQuick 模塊。 o Qt Script,提供腳本化機制。這也是為提供與 Qt 4 的兼容性,如果要使用腳本化支持,請使用 QtQml 模塊的 QJS* 類。 o Qt Script Tools,為使用了 Qt Script 模塊的應用程序提供的額外的組件。 o Qt Sensors,提供訪問各類傳感器的 QML 和 C++ 接口。 o Qt Service Framework,提供客戶端發現其他設備的服務。Qt Service Framework 為在不同平台上發現、實現和訪問服務定義了一套統一的機制。 o Qt SVG,提供渲染和創建 SVG 文件的功能。 o Qt System Info,提供一套 API,用於發現系統相關的信息,比如電池使用量、鎖屏、硬件特性等。 o Qt Tools,提供了 Qt 開發的方便工具,包括 Qt CLucene、Qt Designer、Qt Help 以及 Qt UI Tools 。 o Qt Versit,提供了對 Versit API 的支持。Versit API 是 Personal Information Management API 的一部分,用於 QContacts 和 vCard 以及 QOrganizerItems 和 iCalendar 之間的相互轉換。 o Qt Wayland,僅用於 Linux 平台,用於替代 QWS,包括 Qt Compositor API(server)和 Wayland 平台插件(clients)。 o Qt WebKit,從 Qt 4 移植來的基於 WebKit1 和 QWidget 的 API。 o Qt Widgets,使用 C++ 擴展的 Qt Gui 模塊,提供了一些界面組件,比如按鈕、單選框等。 o Qt XML,SAX 和 DOM 的 C++ 實現。該模塊已經廢除,請使用 QXmlStreamReader/Writer。 o Qt XML Patterns,提供對 XPath、XQuery、XSLT 和 XML Schema 驗證的支持
