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
。
請參閱
AUTOGEN_BUILD_DIR
。
moc
命令列將使用正在調用的目標以及適當建置組態的 COMPILE_DEFINITIONS
和 INCLUDE_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
檔案
<source_dir>/<basename>.ui
<source_dir>/<path><basename>.ui
<AUTOUIC_SEARCH_PATHS>/<basename>.ui
<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
目標¶
moc
和 uic
工具會以 CMake 產生的合成 「<ORIGIN>_autogen」目標 自訂目標
的一部分執行。依預設,「<ORIGIN>_autogen」目標 會繼承 <ORIGIN>
目標的相依性 (請參閱 AUTOGEN_ORIGIN_DEPENDS
)。可以透過將目標相依性新增至 AUTOGEN_TARGET_DEPENDS
目標屬性,將這些相依性新增至 「<ORIGIN>_autogen」目標。
注意
如果使用 Qt 5.15 或更新版本,而且產生器是 Ninja
或 Makefile 產生器,請參閱 「<ORIGIN>_autogen_timestamp_deps」目標。
<ORIGIN>_autogen_timestamp_deps
目標¶
如果使用 Qt 5.15 或更新版本,而且產生器是 Ninja
或 Makefile 產生器,除了 「<ORIGIN>_autogen」目標 之外,也會建立 <ORIGIN>_autogen_timestamp_deps
目標。這個目標沒有任何要執行的原始碼或命令,但它具有先前由 Qt 5.15 之前的 「<ORIGIN>_autogen」目標 繼承的相依性。這些相依性將會作為自訂命令的僅限順序相依性清單,而不會強制自訂命令重新執行。
Visual Studio 產生器¶
使用 Visual Studio 產生器
時,CMake 會產生 PRE_BUILD
自訂命令
,而不是 「<ORIGIN>_autogen」目標 自訂目標
(針對 AUTOMOC
和 AUTOUIC
)。不過,這並非總是可行,而且在以下情況下會使用 「<ORIGIN>_autogen」目標 自訂目標
:
<ORIGIN>
目標依賴於GENERATED
檔案,這些檔案並未被AUTOMOC
和AUTOUIC
排除,而且沒有被SKIP_AUTOMOC
、SKIP_AUTOUIC
、SKIP_AUTOGEN
或CMP0071
排除。AUTOGEN_TARGET_DEPENDS
列出一個原始碼檔案
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)