01、CMake
>>>CMake
是一個(gè)簡化跨不同平臺開發(fā)項(xiàng)目構(gòu)建過程的工具。CMake
自動(dòng)生成生成系統(tǒng),如Makefiles和Visual Studio項(xiàng)目文件。
CMake
是一個(gè)自帶的第三方工具證明文件。
02、如何使用CMake
3.1.0帶Qt 5
>>>開始find_package
找到Qt附帶的庫和頭文件。然后,您可以將這些庫和頭文件與target_link_libraries
命令來構(gòu)建基于Qt的庫和應(yīng)用程序。該命令自動(dòng)添加適當(dāng)?shù)陌夸?、編譯定義、獨(dú)立于位置的代碼標(biāo)志以及到qtmain.lib
例如,Windows上的庫。
03、構(gòu)建GUI執(zhí)行文件
>>>要構(gòu)建helloworld GUI可執(zhí)行文件,您需要以下內(nèi)容:
為find_package
為了成功,CMake
必須通過以下方式之一找到Qt安裝:
【1】將CMAKE_PREFIX_PATH環(huán)境變量設(shè)置為Qt 5安裝前綴。這是推薦的方式。
【2】將CMake緩存中的Qt5_DIR設(shè)置為Qt5Config.cmake文件的位置。
# 設(shè)置CMake的最低版本要求為3.1.0
cmake_minimum_required(VERSION 3.1.0)
# 定義項(xiàng)目名稱為helloworld,版本為1.0.0,使用C++語言
project(helloworld VERSION 1.0.0 LANGUAGES CXX)
# 設(shè)置C++標(biāo)準(zhǔn)為C++11
set(CMAKE_CXX_STANDARD 11)
# 確保所指定的C++標(biāo)準(zhǔn)是必需的
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 開啟自動(dòng)處理MOC(元對象編譯器)、資源文件(RCC)和UI文件(UIC)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# 如果CMake版本低于3.7.0,則設(shè)置包含當(dāng)前目錄的選項(xiàng)為開啟
if(CMAKE_VERSION VERSION_LESS '3.7.0')
set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()
# 找到Qt5庫中的Widgets組件,并且要求這個(gè)組件是必需的
find_package(Qt5 COMPONENTS Widgets REQUIRED)
# 定義可執(zhí)行文件helloworld,并指定其源文件和資源文件
add_executable(helloworld
mainwindow.ui # UI文件
mainwindow.cpp # 主窗口的源文件
main.cpp # 主程序的源文件
resources.qrc # 資源文件
)
# 將Qt5的Widgets庫鏈接到helloworld可執(zhí)行文件
target_link_libraries(helloworld Qt5::Widgets)
04、導(dǎo)入庫目標(biāo)
>>>加載的每個(gè)Qt模塊都定義了一個(gè)CMake庫目標(biāo)。目標(biāo)名以Qt5:::開頭,后面是模塊名。比如:Qt5::Core,Qt5::Gui。將庫目標(biāo)的名稱傳遞給target_link_libraries以使用相應(yīng)的庫。
注意:從Qt 5.15開始,CMake目標(biāo)也可以作為Qt::Core、Qt::Gui等等使用。這簡化了編寫可以在Qt 5和Qt 6上運(yùn)行的CMake代碼。
導(dǎo)入的目標(biāo)使用與配置Qt時(shí)相同的配置創(chuàng)建。那就是:
【1】如果用-debug開關(guān)配置了Qt,則會創(chuàng)建一個(gè)帶有調(diào)試配置的導(dǎo)入目標(biāo)。
【2】如果Qt是用-release開關(guān)配置的,則會創(chuàng)建一個(gè)帶有release配置的導(dǎo)入目標(biāo)。
【3】如果Qt是用-debug-and-release開關(guān)配置的,那么導(dǎo)入的目標(biāo)是用發(fā)布和調(diào)試配置創(chuàng)建的。
如果您的項(xiàng)目具有自定義的CMake構(gòu)建配置,您必須將您的自定義配置映射到debug或release Qt配置。
# 查找Qt5庫中的Core組件,并且要求這個(gè)組件是必需的
find_package(Qt5 COMPONENTS Core REQUIRED)
# 設(shè)置覆蓋率編譯選項(xiàng),將Release配置的編譯標(biāo)志與覆蓋率選項(xiàng)結(jié)合
set(CMAKE_CXX_FLAGS_COVERAGE '${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage')
# 設(shè)置屬性,將Qt5::Core的COVERAGE配置映射到RELEASE配置
# 這意味著在覆蓋率構(gòu)建時(shí)使用Release版本的Qt5::Core
set_target_properties(Qt5::Core PROPERTIES MAP_IMPORTED_CONFIG_COVERAGE 'RELEASE')
05、模塊變量
>>>用find_package加載的Qt模塊設(shè)置各種變量。
例如,find _ package(Qt5 COMPONENTS Widgets)成功時(shí),會使以下變量可用:
變量 | 描述 |
Qt5Widgets_COMPILE_DEFINITIONS | 根據(jù)庫進(jìn)行構(gòu)建時(shí)要使用的編譯定義列表。 |
Qt5Widgets_DEFINITIONS | 根據(jù)庫進(jìn)行構(gòu)建時(shí)要使用的定義列表。 |
Qt5Widgets_EXECUTABLE_COMPILE_FLAGS | 根據(jù)庫生成可執(zhí)行文件時(shí)使用的標(biāo)志字符串。 |
Qt5Widgets_FOUND | 描述是否成功找到模塊的布爾值。 |
Qt5Widgets_INCLUDE_DIRS | 構(gòu)建庫時(shí)要使用的包含目錄列表。 |
Qt5Widgets_LIBRARIES | 模塊導(dǎo)入目標(biāo)的名稱:Qt5::Widgets |
Qt5Widgets_PRIVATE_INCLUDE_DIRS | 構(gòu)建庫和使用私有Qt API時(shí)使用的私有include目錄列表。 |
Qt5Widgets_VERSION_STRING | 包含模塊版本的字符串。 |
06、安裝變量
>>>此外,還有一些變量與特定的包無關(guān),而是與Qt安裝本身有關(guān)。
變量 | 描述 |
QT_DEFAULT_MAJOR_VERSION | 在混合Qt 5和Qt 6項(xiàng)目的情況下,控制qt_ commands轉(zhuǎn)發(fā)到的Qt版本的整數(shù)。在相應(yīng)的find_package()調(diào)用之前,需要將它設(shè)置為5或6。如果設(shè)置為5,以qt_開頭的命令將調(diào)用以qt5_開頭的命令。如果設(shè)置為6,它們將調(diào)用以qt6_開始的對應(yīng)方。如果沒有設(shè)置,第一個(gè)find_package調(diào)用將定義默認(rèn)版本。這個(gè)功能是在Qt 5.15中添加的。 |
QT_LIBINFIX | 用-libinfix配置Qt時(shí),保存庫名中使用的中綴的字符串。 |
QT_NO_CREATE_VERSIONLESS_FUNCTIONS | 從Qt 5.15開始,模塊不僅定義了以qt5_開頭的命令,還定義了以qt_開頭的命令??梢栽趂ind_package之前設(shè)置QT_NO_CREATE_VERSIONLESS_TARGETS 來防止這種情況。 |
QT_NO_CREATE_VERSIONLESS_TARGETS | 從Qt 5.15開始,模塊不僅定義了以Qt 5:::開頭的目標(biāo),還定義了以Qt:::開頭的目標(biāo)??梢栽趂ind_package之前設(shè)置QT_NO_CREATE_VERSIONLESS_TARGETS 來防止這種情況。 |
QT_VISIBILITY_AVAILABLE | 在Unix上,描述Qt庫和插件是否用-fvisibility=hidden編譯的布爾值。這意味著只導(dǎo)出選定的符號。 |
07、CMake命令參考
Qt5::Core |
qt5_add_big_resources | 將大型二進(jìn)制資源編譯成目標(biāo)代碼 |
qt5_add_binary_resources | 從Qt資源文件列表創(chuàng)建一個(gè)RCC文件 |
qt5_add_resources | 將二進(jìn)制資源編譯成源代碼 |
qt5_generate_moc | 對輸入文件調(diào)用moc |
qt5_import_plugins | 指定要為靜態(tài)Qt構(gòu)建導(dǎo)入的自定義插件集 |
qt5_wrap_cpp | 創(chuàng)建來源的.moc文件 |
qt_add_big_resources | 將大型二進(jìn)制資源編譯成目標(biāo)代碼 |
qt_add_binary_resources | 對輸入文件調(diào)用moc |
qt_add_resources | 指定要為靜態(tài)Qt構(gòu)建導(dǎo)入的自定義插件集 |
qt_generate_moc | 對輸入文件調(diào)用moc |
qt_import_plugins | 指定要為靜態(tài)Qt構(gòu)建導(dǎo)入的自定義插件集 |
qt_wrap_cpp | 創(chuàng)建來源的.moc文件 |
Qt5::DBus |
qt_add_dbus_adaptor | 為D-Bus接口生成適配器類 |
qt_add_dbus_interface | 生成實(shí)現(xiàn)D-Bus接口描述文件接口的C++源代碼 |
qt_add_dbus_interfaces | 為D-Bus接口描述文件生成實(shí)現(xiàn)接口的C++源代碼 |
qt_generate_dbus_interface | 從頭文件生成D-Bus接口 |
Qt5::LinguistTools |
qt5_add_translation | 編譯Qt語言學(xué)家.ts文件到.qm管理文件 |
qt5_create_translation | 建立Qt語言學(xué)家翻譯工具鏈 |
Qt5::RemoteObjects |
qt5_generate_repc | 從Qt遠(yuǎn)程對象創(chuàng)建C++類型.rep文件 |
Qt5::Widgets |
qt5_wrap_ui | 為創(chuàng)建源.ui文件 |
qt_wrap_ui | 為創(chuàng)建源.ui文件 |