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 cmake 手冊,了解您的 Qt 版本。

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 依賴一些捆綁的工具進行程式碼產生,例如用於元物件程式碼產生的 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 約定。<basename>.moc 必須由使用者在 C++ 實作檔案中使用前處理器 #include 包含。

包含的 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 目標屬性。

AUTOMOC 目標屬性可以透過設定 CMAKE_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

如果找到與 <path>ui_<basename>.h 相符的前處理器 #include 指令,並且存在 <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

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

目標可以使用應在調用 uic 時使用的選項填充 INTERFACE_AUTOUIC_OPTIONS 目標屬性。這必須與依賴目標的 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}
)

連結到上游匯出的目標的消耗專案,在 AUTOUIC 執行 uic 時,由於與 IMPORTED 目標連結,會自動使用適當的選項

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)

AUTORCC 目標屬性可以透過設定 CMAKE_AUTORCC 變數為所有後續目標預先設定。AUTORCC_OPTIONS 目標屬性可以被填充以設定傳遞給 rcc 的選項。CMAKE_AUTORCC_OPTIONS 變數可以被填充以為所有後續目標預先設定選項。AUTORCC_OPTIONS 原始檔屬性可以在 <name>.qrc 檔案上設定,以設定該檔案的特定選項。這會覆寫來自 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 目標。此目標沒有任何要執行的原始碼或命令,但它具有先前由 pre-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 函式庫的目標指定,Qt 隨附的 qtmain.lib 靜態函式庫將由所有已啟用 WIN32_EXECUTABLE 的依賴可執行檔連結。

若要停用此行為,請為基於 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)