一、CMake入門
下面是使用 Qt 用 C++ 編寫的控制臺應(yīng)用程序的典型文件:CMakeLists.txt
1.構(gòu)建一個控制臺應(yīng)用程序
# 指定應(yīng)用程序所需的CMake最低版本(Qt本身至少需要CMake版本3.16)
cmake_minimum_required(VERSION 3.16)
# 設(shè)置項(xiàng)目名稱和默認(rèn)項(xiàng)目版本,同時告訴CMake該程序是用C++編寫的
project(helloworld VERSION 1.0.0 LANGUAGES CXX)
# 設(shè)置變量CMAKE_CXX_STANDARD,指定C++版本(QT6需要支持c++ 17或更新版本的編譯器)
# 設(shè)置變量CMAKE_CXX_STANDARD_REQUIRED,如果編譯器太舊,讓CMake打印一個錯誤
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 設(shè)置CMake查找Qt6,并導(dǎo)入模塊Core
# 如果CMake找不到模塊,設(shè)置標(biāo)志REQUIRED讓CMake終止
# 如果成功,CMake將設(shè)置一些變量,這些變量記錄在模塊變量中(見變量參考Module variables)
# 為了能找到依賴包,CMake可以設(shè)置變量CMAKE_PREFIX_PATH包含Qt6安裝前綴
find_package(Qt6 REQUIRED COMPONENTS Core)
# qt_standard_project_setup命令為一般的QT應(yīng)用程序設(shè)置項(xiàng)目范圍的默認(rèn)值
# 除此之外,該命令將CMAKE_AUTOMOC變量設(shè)置為ON,指示CMake自動設(shè)置規(guī)則,以便在需要時透明地調(diào)用Qt的元對象編譯器(moc)。
qt_standard_project_setup()
# add_executable命令告訴CMake從指定源文件構(gòu)建一個可執(zhí)行文件(而不是庫)
# 注意,這里通常不列出頭文件。這與qmake不同,qmake需要顯式列出頭文件,以便元對象編譯器(moc)處理它們。
# 對于比較復(fù)雜的項(xiàng)目需要改為調(diào)用qt_add_executable(),它是內(nèi)置add_executable()命令的包裝器,提供了額外的邏輯來自動處理諸如在靜態(tài)Qt構(gòu)建中鏈接Qt插件、特定于平臺的庫名定制等。
# 要創(chuàng)建庫,使用qt_add_library。
add_executable(helloworld
main.cpp
)
# 最后告訴CMake, helloworld可執(zhí)行文件通過引用由上面的find_package()調(diào)用導(dǎo)入的Qt6::Core目標(biāo)來使用Qt的Core模塊。這不僅可以為鏈接器添加正確的參數(shù),還可以確保將正確的include目錄、編譯器定義傳遞給c++編譯器。PRIVATE關(guān)鍵字對于可執(zhí)行目標(biāo)并不是嚴(yán)格必要的,但是指定它是一種良好的實(shí)踐。
# 如果helloworld是一個庫而不是可執(zhí)行文件,則應(yīng)該指定PRIVATE或PUBLIC(如果庫在頭文件中提到了來自Qt6::Core的內(nèi)容,則為PUBLIC,否則為PRIVATE)
target_link_libraries(helloworld PRIVATE Qt6::Core)
2.構(gòu)建一個界面應(yīng)用程序
cmake_minimum_required(VERSION 3.16)
project(helloworld VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_standard_project_setup()
add_executable(helloworld
mainwindow.ui
mainwindow.cpp
main.cpp
)
target_link_libraries(helloworld PRIVATE Qt6::Widgets)
# 最后,我們在應(yīng)用程序目標(biāo)上設(shè)置屬性,效果如下:
# 防止在Windows上創(chuàng)建控制臺窗口。
# 在macOS上創(chuàng)建應(yīng)用程序包。
set_target_properties(helloworld PROPERTIES
WIN32_EXECUTABLE ON
MACOSX_BUNDLE ON
)
3.構(gòu)建子目錄項(xiàng)目
- 項(xiàng)目目錄結(jié)構(gòu)
<project root>
├── CMakeLists.txt
└── src
└── app
├── CMakeLists.txt
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui
- 頂層CMakeLists.txt,包含整個項(xiàng)目的設(shè)置并調(diào)用add_subdirectory,頂層CMakeLists.txt設(shè)置的變量在子目錄項(xiàng)目中可見
cmake_minimum_required(VERSION 3.16)
project(helloworld VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_standard_project_setup()
add_subdirectory(src/app)
- 子目錄項(xiàng)目CMakeLists.txt
add_executable(helloworld
mainwindow.ui
mainwindow.cpp
main.cpp
)
target_link_libraries(helloworld PRIVATE Qt6::Widgets)
set_target_properties(helloworld PROPERTIES
WIN32_EXECUTABLE ON
MACOSX_BUNDLE ON
)
4.構(gòu)建庫和使用庫
- 項(xiàng)目目錄結(jié)構(gòu)
<project root>
├── CMakeLists.txt
└── src
├── app
│ ├── ...
│ └── main.cpp
└── businesslogic
├── CMakeLists.txt
├── businesslogic.cpp
└── businesslogic.h
- 庫項(xiàng)目文件(src/businesslogic/CMakeLists.txt)
# add_library命令創(chuàng)建businesslogic庫,STATIC表示靜態(tài)庫,SHARED表示動態(tài)庫
add_library(businesslogic STATIC
businesslogic.cpp
)
target_link_libraries(businesslogic PRIVATE Qt6::Core)
# 通過調(diào)用target_include_directories,確保businesslogic目錄的絕對路徑被自動添加為使用我們的庫的所有目標(biāo)的包含路徑。
# 這使我們在main.cpp中不用使用相對路徑來定位businesslogic.h。相反,我們可以直接寫#include <businesslogic.h>
target_include_directories(businesslogic INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
最后,我們必須將庫的子目錄添加到頂級項(xiàng)目文件中:
add_subdirectory(src/app)
add_subdirectory(src/businesslogic)
- 使用庫
target_link_libraries(helloworld PRIVATE
businesslogic
Qt6::Widgets)
5.添加資源
qt_add_resources(helloworld imageresources
PREFIX "/images"
FILES logo.png splashscreen.png
)
用法:
logoLabel->setPixmap(QPixmap(":/images/logo.png"));
6.添加翻譯
qt_add_translations(helloworld
TS_FILES helloworld_de.ts helloworld_fr.ts)
要更新.ts文件中的條目,構(gòu)建update_translations目標(biāo):
$ cmake --build . --target update_translations
要手動觸發(fā).qm文件的生成,構(gòu)建release_translations目標(biāo):
$ cmake --build . --target release_translations
二、CMake命令參考(CMake Command Reference)
-
Qt6::Core
CMake命令 描述 qt_add_big_resources 將大型二進(jìn)制資源編譯為目標(biāo)代碼 qt_add_binary_resources 從 Qt 資源文件列表創(chuàng)建 RCC 文件 qt_add_executable 創(chuàng)建并最終確定指定平臺類型的應(yīng)用程序目標(biāo) qt_add_library 創(chuàng)建并完成庫 qt_add_plugin 創(chuàng)建 Qt 插件目標(biāo) qt_add_resources 將二進(jìn)制資源編譯為源代碼 qt_allow_non_utf8_sources 防止強(qiáng)制將源文件視為適用于 Windows 的 UTF-8 qt_android_add_apk_target 定義運(yùn)行安卓部署qt以生成APK的構(gòu)建目標(biāo) qt_android_apply_arch_suffix 將目標(biāo)二進(jìn)制文件的名稱配置為包含特定于體系結(jié)構(gòu)的后綴 qt_android_generate_deployment_settings 生成 androiddeployqt 所需的部署設(shè)置文件 qt_deploy_qt_conf 在部署時編寫 qt.conf 文件 qt_deploy_runtime_dependencies 部署可執(zhí)行文件所需的Qt插件,Qt和非Qt庫 qt_disable_unicode_defines 防止在目標(biāo)上自動設(shè)置某些與 Unicode 相關(guān)的編譯器定義 qt_extract_metatypes 防止在目標(biāo)上自動設(shè)置某些與 Unicode 相關(guān)的編譯器定義 qt_finalize_project 處理與Qt項(xiàng)目相關(guān)的各種常見平臺特定任務(wù) qt_finalize_target 處理與Qt目標(biāo)相關(guān)的各種常見平臺特定任務(wù) qt_generate_deploy_app_script 為應(yīng)用程序生成部署腳本 qt_generate_moc 對輸入文件調(diào)用 moc qt_import_plugins 指定要為靜態(tài)Qt構(gòu)建導(dǎo)入的自定義插件集 qt_set_finalizer_mode 自定義目標(biāo)最終確定的各個方面 qt_standard_project_setup 將項(xiàng)目范圍的默認(rèn)設(shè)置設(shè)置為標(biāo)準(zhǔn)排列 qt_wrap_cpp 從源文件創(chuàng)建.moc文件 -
Qt6::DBus
CMake命令 描述 qt_add_dbus_adaptor 將項(xiàng)目范圍的默認(rèn)設(shè)置設(shè)置為標(biāo)準(zhǔn)排列 qt_add_dbus_interface 生成實(shí)現(xiàn) D-Bus 接口描述文件接口的C++源 qt_add_dbus_interfaces 生成實(shí)現(xiàn) D-Bus 接口描述文件接口的C++源 qt_generate_dbus_interface 從頭文件生成 D-Bus 接口 -
Qt6::InterfaceFramework
CMake命令 描述 qt_ifcodegen_extend_target 使用從 qface IDL 文件生成的文件擴(kuò)展目標(biāo) qt_ifcodegen_generate 從 qface IDL 文件生成文件 qt_ifcodegen_import_variables 從 qface IDL 文件生成文件,并提供變量以在 CMake 中使用 qt_set_ifcodegen_variable 將變量設(shè)置為 ifcodegen 模板中的給定 c 值 -
Qt6::LinguistTools
CMake命令 描述 qt_add_lrelease 添加目標(biāo)以將Qt語言學(xué)家.ts文件轉(zhuǎn)換為.qm文件 qt_add_lupdate 添加目標(biāo)以生成或更新Qt語言學(xué)家.ts文件 qt_add_translation 添加目標(biāo)以生成或更新Qt語言學(xué)家.ts文件 qt_add_translations 添加目標(biāo)以更新Qt Linguist .ts文件并將其轉(zhuǎn)換為.qm文件 qt_create_translation 設(shè)置Qt語言學(xué)家翻譯工具鏈 -
Qt6::Qml
CMake命令 描述 qt_add_qml_module 設(shè)置Qt語言學(xué)家翻譯工具鏈 qt_add_qml_plugin 定義與 QML 模塊關(guān)聯(lián)的插件 qt_deploy_qml_imports 部署可執(zhí)行文件所需的 QML 模塊的運(yùn)行時組件 qt_generate_deploy_qml_app_script 為 QML 應(yīng)用程序生成部署腳本 qt_generate_foreign_qml_types 在 QML 模塊中注冊來自一個目標(biāo)的類型 qt_import_qml_plugins 確保為靜態(tài)構(gòu)建導(dǎo)入目標(biāo)所需的 QML 插件 qt_query_qml_module 檢索有關(guān) QML 模塊的信息 qt_target_compile_qml_to_cpp qt_target_qml_sources 檢索有關(guān) QML 模塊的信息 -
Qt6::RemoteObjects
CMake命令 描述 qt_add_repc_merged 從 Qt 遠(yuǎn)程對象 .rep 文件為源和副本類型創(chuàng)建C++頭文件 qt_add_repc_replicas 從 Qt 遠(yuǎn)程對象 .rep 文件為副本類型創(chuàng)建C++頭文件 qt_add_repc_sources 從 Qt 遠(yuǎn)程對象 .rep 文件為源類型創(chuàng)建C++頭文件 qt_reps_from_headers 從 QObject 頭文件創(chuàng)建 .rep 文件 -
Qt6::Scxml
CMake命令 描述 qt_add_statecharts -
Qt6::ShaderTools
CMake命令 描述 Qt Shader Tools Build System Integration 編譯著色器并將其添加到Qt資源 -
Qt6::Widgets
CMake命令 描述 qt_wrap_ui 編譯著色器并將其添加到Qt資源 -
Qt6::WebEngineCore
CMake命令 描述 qt_add_webengine_dictionary 將 hunspell 字典格式轉(zhuǎn)換為 bdict 二進(jìn)制格式
三、CMake變量參考(CMake Variable Reference)
1.模塊變量(Module variables)
變量 | 描述 |
---|---|
Qt6Widgets_COMPILE_DEFINITIONS | 針對庫構(gòu)建時使用的編譯定義列表。 |
Qt6Widgets_DEFINITIONS | 針對庫進(jìn)行構(gòu)建時使用的定義列表。 |
Qt6Widgets_EXECUTABLE_COMPILE_FLAGS | 針對庫構(gòu)建可執(zhí)行文件時使用的標(biāo)志字符串。 |
Qt6Widgets_FOUND | 描述是否成功找到模塊的布爾值。 |
Qt6Widgets_INCLUDE_DIRS | 針對庫構(gòu)建時使用的包含目錄列表。 |
Qt6Widgets_LIBRARIES | 模塊導(dǎo)入的目標(biāo)的名稱:Qt5::Widgets |
Qt6Widgets_PRIVATE_INCLUDE_DIRS | 在構(gòu)建庫和使用私有Qt API時使用的私有包含目錄列表。 |
Qt6Widgets_VERSION_STRING | 包含模塊版本的字符串。 |
2.安裝變量(Installation variables)
變量 | 描述 |
---|---|
QT_DEFAULT_MAJOR_VERSION | 在混合Qt 5和Qt 6項(xiàng)目的情況下,在調(diào)用相應(yīng)的find_package()之前,需要將其設(shè)置為5或6。如果未設(shè)置,第一次find_package調(diào)用將定義默認(rèn)版本。 |
QT_LIBINFIX | 當(dāng)Qt配置了-libinfix時,保存庫名稱中使用的中綴的字符串。 |
QT_NO_CREATE_VERSIONLESS_FUNCTIONS | 隱藏以qt_開頭的命令,只保留以qt6_開頭的版本化命令。 |
QT_NO_CREATE_VERSIONLESS_TARGETS | 隱藏導(dǎo)入的以Qt::開頭的目標(biāo)。相反,您需要使用以Qt6::開頭的目標(biāo)。 |
QT_VISIBILITY_AVAILABLE | 在Unix上,一個布爾值,用于描述Qt庫和插件是否使用-fvisibility=hidden進(jìn)行編譯。這意味著只導(dǎo)出選定的符號。 |
3.項(xiàng)目變量(Project variables)
-
Qt6::Core
變量 | 描述 |
---|---|
ANDROID_NDK_HOST_SYSTEM_NAME | 特定于android的主機(jī)系統(tǒng)架構(gòu) |
ANDROID_SDK_ROOT | Android SDK的位置 |
QT_ANDROID_ABIS | 為其構(gòu)建項(xiàng)目包的abi列表 |
QT_ANDROID_APPLICATION_ARGUMENTS | 要傳遞給Android應(yīng)用程序的參數(shù)列表 |
QT_ANDROID_BUILD_ALL_ABIS | 允許使用自動檢測的Qt for Android SDK列表構(gòu)建多abi包 |
QT_ANDROID_MULTI_ABI_FORWARD_VARS | 允許在多個abi構(gòu)建中共享CMake變量 |
QT_ANDROID_SIGN_AAB | 使用指定的密鑰庫、別名和存儲密碼對.aab包進(jìn)行簽名 |
QT_ANDROID_SIGN_APK | 使用指定的密鑰庫、別名和存儲密碼對包進(jìn)行簽名 |
QT_DEPLOY_BIN_DIR | 前綴-相對子目錄,用于在某些目標(biāo)平臺上部署運(yùn)行時二進(jìn)制文件 |
QT_DEPLOY_LIB_DIR | 前綴相對子目錄,用于在某些目標(biāo)平臺上部署庫 |
QT_DEPLOY_PLUGINS_DIR | 前綴-相對子目錄,用于在一些目標(biāo)平臺上部署Qt插件 |
QT_DEPLOY_PREFIX | 部署的基本位置 |
QT_DEPLOY_QML_DIR | 前綴-相對子目錄,用于在一些目標(biāo)平臺上部署QML插件 |
QT_DEPLOY_SUPPORT | 要包括用于設(shè)置部署支持的文件的名稱 |
QT_ENABLE_VERBOSE_DEPLOYMENT | 啟用部署工具的詳細(xì)模式 |
QT_HOST_PATH | 交叉編譯時主機(jī)Qt安裝的位置 |
QT_IOS_LAUNCH_SCREEN | 所有目標(biāo)使用的iOS啟動屏幕故事板的路徑 |
QT_NO_COLLECT_BUILD_TREE_APK_DEPS | 防止在Android部署期間收集項(xiàng)目構(gòu)建的共享庫目標(biāo) |
QT_NO_SET_XCODE_BUNDLE_IDENTIFIER | 在iOS上禁用在目標(biāo)終結(jié)期間提供備用應(yīng)用程序包ID |
QT_NO_SET_XCODE_DEVELOPMENT_TEAM_ID | 在iOS上禁用在目標(biāo)完成過程中提供備用團(tuán)隊(duì)ID |
QT_NO_STANDARD_PROJECT_SETUP | 防止后續(xù)對qt_standard_project_setup()的調(diào)用進(jìn)行任何更改 |
QT_PATH_ANDROID_ABI_ | 為相應(yīng)的ABI指定Qt for Android路徑的變量集 |
-
Qt6::Qml
變量 | 描述 |
---|---|
QT_QML_OUTPUT_DIRECTORY | 默認(rèn)情況下將在其下面創(chuàng)建QML模塊的基本輸出目錄 |
-
Qt6::InterfaceFramework
變量 | 描述 |
---|---|
IFCODEGEN_VERBOSE | 為所有ifcodegen函數(shù)啟用詳細(xì)日志記錄 |
QT_IFCODEGEN_TEMPLATE_SEARCH_PATH | ifcodegen模板的搜索路徑 |
四、CMake屬性參考(CMake Property Reference)
-
Qt6::Core
目標(biāo)屬性
屬性 | 描述 |
---|---|
QT_ANDROID_ABIS | 為單個目標(biāo)的包構(gòu)建的abi列表 |
QT_ANDROID_DEPLOYMENT_DEPENDENCIES | 覆蓋添加到目標(biāo)部署中的Qt依賴項(xiàng) |
QT_ANDROID_DEPLOYMENT_SETTINGS_FILE | 指定目標(biāo)生成的部署設(shè)置文件的位置 |
QT_ANDROID_EXTRA_LIBS | 要與目標(biāo)一起部署的額外庫 |
QT_ANDROID_EXTRA_PLUGINS | 額外的Qt插件與目標(biāo)一起部署 |
QT_ANDROID_MIN_SDK_VERSION | Android SDK最低版本 |
QT_ANDROID_NO_DEPLOY_QT_LIBS | Qt共享庫是否打包在Android的APK中 |
QT_ANDROID_PACKAGE_SOURCE_DIR | 自定義Android包模板的路徑 |
QT_ANDROID_SDK_BUILD_TOOLS_REVISION | Android構(gòu)建工具的修訂使用 |
QT_ANDROID_SYSTEM_LIBS_PREFIX | 指定Qt庫在目標(biāo)設(shè)備上的位置 |
QT_ANDROID_TARGET_SDK_VERSION | Android目標(biāo)SDK版本 |
QT_ANDROID_VERSION_CODE | Android內(nèi)部應(yīng)用版本 |
QT_ANDROID_VERSION_NAME | 可讀的安卓應(yīng)用版本 |
QT_IOS_LAUNCH_SCREEN | iOS啟動屏幕故事板的路徑 |
QT_QML_IMPORT_PATH | 指定要搜索QML導(dǎo)入的目錄列表 |
QT_QML_ROOT_PATH | 覆蓋應(yīng)用程序qml目錄的位置 |
QT_RESOURCE_PREFIX | 指定默認(rèn)的Qt資源前綴 |
QT_WASM_INITIAL_MEMORY | 內(nèi)部WebAssembly初始內(nèi)存 |
QT_WASM_PTHREAD_POOL_SIZE | 內(nèi)部WebAssembly線程池大小 |
qt_no_entrypoint | 指定禁止鏈接到Qt的入口點(diǎn)庫 |
源文件屬性文章來源地址http://www.zghlxwxcb.cn/news/detail-615589.html
屬性 | 描述 |
---|---|
QT_RESOURCE_ALIAS | 為資源中的文件指定Qt資源別名 |
-
Qt6::DBus
源文件屬性文章來源:http://www.zghlxwxcb.cn/news/detail-615589.html
屬性 | 描述 |
---|---|
CLASSNAME | 覆蓋默認(rèn)的接口類名 |
INCLUDE | 添加一個包含路徑 |
NO_NAMESPACE | 禁止生成名稱空間名稱 |
-
Qt6::Qml
源文件屬性
屬性 | 描述 |
---|---|
QT_QMLTC_FILE_BASENAME | 指定非默認(rèn)的.h和.cpp文件名 |
QT_QML_INTERNAL_TYPE | 將QML文件標(biāo)記為提供內(nèi)部類型 |
QT_QML_SINGLETON_TYPE | 將QML文件標(biāo)記為提供單例類型 |
QT_QML_SKIP_CACHEGEN | 不允許將文件編譯為字節(jié)代碼 |
QT_QML_SKIP_QMLDIR_ENTRY | 排除一個文件作為類型添加到QML模塊的typeinfo文件 |
QT_QML_SKIP_QMLLINT | 防止一個文件被自動qmllint處理 |
QT_QML_SKIP_TYPE_COMPILER | 不允許使用qmltc將文件編譯為c++ |
QT_QML_SOURCE_TYPENAME | 重寫文件提供的類型名稱 |
QT_QML_SOURCE_VERSIONS | 指定類型的自定義版本集 |
到了這里,關(guān)于CMake+QT使用教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!