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
。
請參閱
AUTOGEN_BUILD_DIR
。
moc
命令列將使用為其調用的目標以及適當的建置組態中的 COMPILE_DEFINITIONS
和 INCLUDE_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
檔案在以下位置搜尋
<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
。
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
目標¶
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
目標。此目標沒有任何要執行的原始碼或命令,但它具有先前由 pre-Qt 5.15 <ORIGIN>_autogen 目標 目標繼承的依賴性。這些依賴性將用作自訂命令的僅順序依賴性清單,而不會強制自訂命令重新執行。
Visual Studio 產生器¶
當使用 Visual Studio 產生器
時,CMake 會產生 PRE_BUILD
自訂命令
,而不是 <ORIGIN>_autogen 目標 自訂目標
(對於 AUTOMOC
和 AUTOUIC
)。但這並非總是可能的,並且當以下任一情況時,會使用 <ORIGIN>_autogen 目標 自訂目標
:
<ORIGIN>
目標依賴於未從AUTOMOC
和AUTOUIC
中排除的GENERATED
檔案,透過SKIP_AUTOMOC
、SKIP_AUTOUIC
、SKIP_AUTOGEN
或CMP0071
AUTOGEN_TARGET_DEPENDS
列出原始檔
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)