CMake中添加Qt模塊的合理方法

用CMake來組織的工程中要用Qt首先要設(shè)置、找到Qt相關(guān)模塊。主要是通過find_package這個(gè)CMake命令。但網(wǎng)上很多教程都過時(shí)了,或者不夠清晰靈活。因?yàn)檫@部分很常用,所以特別用一篇文章把我們目前在生產(chǎn)環(huán)境中使用的方法給大家介紹下。

設(shè)置Qt庫路徑

Qt版本很多,我們的開發(fā)機(jī)上一般也裝有多個(gè)不同版本的Qt。個(gè)人嘗試性的項(xiàng)目一般用最新版的Qt,而真正發(fā)布的產(chǎn)品一般用的是LTS版本Qt(LTS:Long Term Support,長期支持版本,目前最新的LTS是5.9)。

我們的方法是在系統(tǒng)中添加多個(gè)環(huán)境變量。例如我電腦上裝有4個(gè)版本:Qt 5.9.4和Qt5.10.1的32位和64位庫。所以有4個(gè)環(huán)境變量:

環(huán)境變量名
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{}里選擇不同的環(huán)境變量就可以切換不同的Qt版本。

查找Qt模塊

網(wǎng)上很多CMake查找Qt方法都是過時(shí)的Qt4的方法。現(xiàn)在正確的、最新的方法是:

find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)

Components后面加的就是這個(gè)工程中會(huì)用到的Qt模塊,例如上面就用到了Core、Gui、Qml、Quick這幾個(gè)模塊,也是一般一個(gè)Qt Quick程序必須用到的幾個(gè)模塊。

打開相關(guān)自動(dòng)選項(xiàng)

Qt Quick程序中的QRC資源文件需要用rcc來進(jìn)行預(yù)處理,生成相應(yīng).h.cpp文件。QObject派生的C++類也需要通過moc進(jìn)行處理。這些都是編譯系統(tǒng)中所謂的Rules。CMake中通過打開下面兩個(gè)選項(xiàng)可以自動(dòng)對這些后綴的文件進(jìn)行相應(yīng)處理:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

由于生成的C++文件都是放在編譯目錄里的(在Shadow Building中有別于源碼目錄),所以還需要將編譯目錄包含到Include目錄,否則編譯器會(huì)找不到這些頭文件:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

鏈接時(shí)設(shè)置相應(yīng)模塊

最后一步是在鏈接的時(shí)候把用到的Qt庫寫上去:

target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)

這樣就能鏈接上用到的Qt庫了。

完整的CMake例子

上面只是著重說明了CMake關(guān)于添加Qt模塊的代碼,一個(gè)完整的CMake例子肯定不止上面這些。下面就貼出一個(gè)完整的例子:

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)

當(dāng)需求復(fù)雜之后CMake中還會(huì)有很多命令,這個(gè)以后我們介紹具體技術(shù)的時(shí)候再講。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容