cmake-qt(7)

簡介

CMake 可以尋找並使用 Qt 4、Qt 5 和 Qt 6 函式庫。Qt 4 函式庫由 CMake 隨附的 FindQt4 尋找模組找到,而 Qt 5 和 Qt 6 函式庫則使用 Qt 5 和 Qt 6 隨附的「設定檔套件」找到。有關 CMake 套件的更多資訊,請參閱 cmake-packages(7),並參閱您的 Qt 版本適用的 Qt cmake 手冊

Qt 4、Qt 5 和 Qt 6 可以在同一個 CMake 建置系統 中一起使用

cmake_minimum_required(VERSION 3.16 FATAL_ERROR)

project(Qt4_5_6)

set(CMAKE_AUTOMOC ON)

find_package(Qt6 COMPONENTS Widgets DBus REQUIRED)
add_executable(publisher publisher.cpp)
target_link_libraries(publisher Qt6::Widgets Qt6::DBus)

find_package(Qt5 COMPONENTS Gui DBus REQUIRED)
add_executable(subscriber1 subscriber1.cpp)
target_link_libraries(subscriber1 Qt5::Gui Qt5::DBus)

find_package(Qt4 REQUIRED)
add_executable(subscriber2 subscriber2.cpp)
target_link_libraries(subscriber2 Qt4::QtGui Qt4::QtDBus)

一個 CMake 目標不得連結到一個以上的 Qt 版本。如果嘗試連結,或因傳遞目標依賴性評估而導致連結到多個 Qt 版本,則會發出診斷訊息。

Qt 建置工具

Qt 依賴一些捆綁的工具進行程式碼產生,例如用於產生 meta-object 程式碼的 moc、用於 widget 配置和填充的 uic,以及用於產生虛擬檔案系統內容的 rcc。如果滿足適當的條件,cmake(1) 可以自動調用這些工具。自動工具調用可與 Qt 版本 4 到 6 一起使用。

AUTOMOC

AUTOMOC 目標屬性控制 cmake(1) 是否檢查目標中的 C++ 檔案以判斷是否需要執行 moc,並建立在適當時間執行 moc 的規則。

如果在標頭檔中找到來自 AUTOMOC_MACRO_NAMES 的巨集,則將對該檔案執行 moc。結果將放入根據 moc_<basename>.cpp 命名的檔案中。如果在 C++ 實作檔案中找到該巨集,則 moc 輸出將放入根據 <basename>.moc 命名的檔案中,遵循 Qt 慣例。使用者必須使用預處理器 #include 在 C++ 實作檔案中包含 <basename>.moc

包含的 moc_*.cpp*.moc 檔案將在 <AUTOGEN_BUILD_DIR>/include 目錄中產生,該目錄會自動新增至目標的 INCLUDE_DIRECTORIES

  • 這與 CMake 3.7 及以下版本不同;請參閱其文件以取得詳細資訊。

  • 對於 配置 產生器,包含目錄為 <AUTOGEN_BUILD_DIR>/include_<CONFIG>

  • 請參閱 AUTOGEN_BUILD_DIR

未包含的 moc_<basename>.cpp 檔案將在自訂資料夾中產生,以避免名稱衝突,並包含在單獨的檔案中,該檔案會編譯到目標中,名為 <AUTOGEN_BUILD_DIR>/mocs_compilation.cpp<AUTOGEN_BUILD_DIR>/mocs_compilation_$<CONFIG>.cpp

moc 命令列將使用正在調用的目標以及適當建置組態的 COMPILE_DEFINITIONSINCLUDE_DIRECTORIES 目標屬性。

可以透過設定 CMAKE_AUTOMOC 變數,為所有後續目標預先設定 AUTOMOC 目標屬性。可以填入 AUTOMOC_MOC_OPTIONS 目標屬性,以設定要傳遞給 moc 的選項。可以填入 CMAKE_AUTOMOC_MOC_OPTIONS 變數,為所有後續目標預先設定選項。

可以將要搜尋的其他巨集名稱新增至 AUTOMOC_MACRO_NAMES

可以使用 AUTOMOC_DEPEND_FILTERS 從原始程式碼中擷取其他 moc 依賴性檔案名稱。

可以透過啟用 SKIP_AUTOMOC 或範圍更廣的 SKIP_AUTOGEN,將來源 C++ 檔案排除在 AUTOMOC 處理之外。

AUTOUIC

AUTOUIC 目標屬性控制 cmake(1) 是否檢查目標中的 C++ 檔案,以判斷是否需要執行 uic,並建立在適當時間執行 uic 的規則。

如果找到符合 #include 指示的預處理器 <path>ui_<basename>.h,並且存在 <basename>.ui 檔案,則將執行 uic 以產生適當的檔案。會在下列位置搜尋 <basename>.ui 檔案

  1. <source_dir>/<basename>.ui

  2. <source_dir>/<path><basename>.ui

  3. <AUTOUIC_SEARCH_PATHS>/<basename>.ui

  4. <AUTOUIC_SEARCH_PATHS>/<path><basename>.ui

其中 <source_dir> 是 C++ 檔案的目錄,而 AUTOUIC_SEARCH_PATHS 是其他搜尋路徑的清單。

產生的 ui_*.h 檔案會放置在 <AUTOGEN_BUILD_DIR>/include 目錄中,該目錄會自動新增至目標的 INCLUDE_DIRECTORIES

  • 這與 CMake 3.7 及以下版本不同;請參閱其文件以取得詳細資訊。

  • 對於 配置 產生器,包含目錄為 <AUTOGEN_BUILD_DIR>/include_<CONFIG>

  • 請參閱 AUTOGEN_BUILD_DIR

可以透過設定 CMAKE_AUTOUIC 變數,為所有後續的目標預先設定 AUTOUIC 目標屬性。可以填入 AUTOUIC_OPTIONS 目標屬性,以設定要傳遞給 uic 的選項。可以填入 CMAKE_AUTOUIC_OPTIONS 變數,為所有後續的目標預先設定選項。可以在 <basename>.ui 檔案上設定 AUTOUIC_OPTIONS 原始碼檔案屬性,以設定該檔案的特定選項。這會覆寫 AUTOUIC_OPTIONS 目標屬性中的選項。

目標可以填入 INTERFACE_AUTOUIC_OPTIONS 目標屬性,其中包含在呼叫 uic 時應該使用的選項。這必須與依賴目標的 AUTOUIC_OPTIONS 目標屬性內容一致。可以使用 CMAKE_DEBUG_TARGET_PROPERTIES 變數來追蹤此類 INTERFACE_AUTOUIC_OPTIONS 的來源目標。這表示為 Qt 提供替代翻譯系統的程式庫可以指定在執行 uic 時應使用的選項。

add_library(KI18n klocalizedstring.cpp)
target_link_libraries(KI18n Qt6::Core)

# KI18n uses the tr2i18n() function instead of tr().  That function is
# declared in the klocalizedstring.h header.
set(autouic_options
  -tr tr2i18n
  -include klocalizedstring.h
)

set_property(TARGET KI18n APPEND PROPERTY
  INTERFACE_AUTOUIC_OPTIONS ${autouic_options}
)

透過與 IMPORTED 目標連結,使用上游匯出的目標的專案在 AUTOUIC 執行 uic 時會自動使用適當的選項。

set(CMAKE_AUTOUIC ON)
# Uses a libwidget.ui file:
add_library(LibWidget libwidget.cpp)
target_link_libraries(LibWidget
  KF5::KI18n
  Qt5::Widgets
)

透過啟用 SKIP_AUTOUIC 或更廣泛的 SKIP_AUTOGEN,可以將原始碼檔案排除在 AUTOUIC 處理之外。

AUTORCC

AUTORCC 目標屬性會控制 cmake(1) 是否會在具有 .qrc 副檔名的原始碼檔案上,於適當的時間建立執行 rcc 的規則。

add_executable(myexe main.cpp resource_file.qrc)

可以透過設定 CMAKE_AUTORCC 變數,為所有後續的目標預先設定 AUTORCC 目標屬性。可以填入 AUTORCC_OPTIONS 目標屬性,以設定要傳遞給 rcc 的選項。可以填入 CMAKE_AUTORCC_OPTIONS 變數,為所有後續的目標預先設定選項。可以在 <name>.qrc 檔案上設定 AUTORCC_OPTIONS 原始碼檔案屬性,以設定該檔案的特定選項。這會覆寫 AUTORCC_OPTIONS 目標屬性中的選項。

透過啟用 SKIP_AUTORCC 或更廣泛的 SKIP_AUTOGEN,可以將原始碼檔案排除在 AUTORCC 處理之外。

<ORIGIN>_autogen 目標

mocuic 工具會以 CMake 產生的合成 「<ORIGIN>_autogen」目標 自訂目標 的一部分執行。依預設,「<ORIGIN>_autogen」目標 會繼承 <ORIGIN> 目標的相依性 (請參閱 AUTOGEN_ORIGIN_DEPENDS)。可以透過將目標相依性新增至 AUTOGEN_TARGET_DEPENDS 目標屬性,將這些相依性新增至 「<ORIGIN>_autogen」目標

注意

如果使用 Qt 5.15 或更新版本,而且產生器是 NinjaMakefile 產生器,請參閱 「<ORIGIN>_autogen_timestamp_deps」目標

<ORIGIN>_autogen_timestamp_deps 目標

如果使用 Qt 5.15 或更新版本,而且產生器是 NinjaMakefile 產生器,除了 「<ORIGIN>_autogen」目標 之外,也會建立 <ORIGIN>_autogen_timestamp_deps 目標。這個目標沒有任何要執行的原始碼或命令,但它具有先前由 Qt 5.15 之前的 「<ORIGIN>_autogen」目標 繼承的相依性。這些相依性將會作為自訂命令的僅限順序相依性清單,而不會強制自訂命令重新執行。

Visual Studio 產生器

使用 Visual Studio 產生器 時,CMake 會產生 PRE_BUILD 自訂命令,而不是 「<ORIGIN>_autogen」目標 自訂目標 (針對 AUTOMOCAUTOUIC)。不過,這並非總是可行,而且在以下情況下會使用 「<ORIGIN>_autogen」目標 自訂目標

Windows 上的 qtmain.lib

Qt 4 和 5 的 IMPORTED 目標針對 QtGui 函式庫指定,所有啟用 WIN32_EXECUTABLE 的相依執行檔都會連結 Qt 隨附的 qtmain.lib 靜態函式庫。

若要停用此行為,請針對基於 Qt 5 的目標啟用 Qt5_NO_LINK_QTMAIN 目標屬性,或針對基於 Qt 4 的目標啟用 QT4_NO_LINK_QTMAIN 目標屬性。

add_executable(myexe WIN32 main.cpp)
target_link_libraries(myexe Qt4::QtGui)

add_executable(myexe_no_qtmain WIN32 main_no_qtmain.cpp)
set_property(TARGET main_no_qtmain PROPERTY QT4_NO_LINK_QTMAIN ON)
target_link_libraries(main_no_qtmain Qt4::QtGui)