cmake-qt(7)¶
简介¶
CMake 可以查找并使用 Qt 4、Qt 5 和 Qt 6 库。Qt 4 库由 CMake 附带提供的 find-module FindQt4
查找,而 Qt 5 和 Qt 6 库则使用 Qt 5 和 Qt 6 附带提供的“Config-file 包”查找。有关 CMake 包的详细信息,请参阅 cmake-packages(7)
;有关 Qt 版本的详细信息,请参阅 Qt cmake 手册。
Qt 4、Qt 5 和 Qt 6 可以在同一个 CMake buildsystem
中一起使用。
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
用于元对象代码生成、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
目标属性,从它被调用的目标,以及适合的构建配置。
通过设置 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
。
如果找到与 <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 及之前的版本有所不同;有关详细信息,请参阅其文档。
对于
multi configuration generators
,包含目录为<AUTOGEN_BUILD_DIR>/include_<CONFIG>
。
AUTOUIC
目标属性可以通过设置 CMAKE_AUTOUIC
变量来针对所有后续目标预先设定。可以填充 AUTOUIC_OPTIONS
目标属性以设置要传递给 uic
的选项。可以填充 CMAKE_AUTOUIC_OPTIONS
变量以针对所有后续目标预先设定选项。可以设置 AUTOUIC_OPTIONS
源文件属性,方法是在 <basename>.ui
文件上设置它,以针对文件设置特定选项。这将覆盖来自 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}
)
连接到从上游导出的目标的消耗项目会在 uic
通过 AUTOUIC
运行时使用相应选项,作为与 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
变量来预先设置所有后续目标的选项。可以通过在<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 Generators,请参见 <ORIGIN>_autogen_timestamp_deps 目标。
<ORIGIN>_autogen_timestamp_deps
目标¶
如果使用 Qt 5.15 或更高版本,并且生成器是 Ninja
或 Makefile Generators,则除 <ORIGIN>_autogen_timestamp_deps
目标。此目标没有任何要执行的源文件或命令,但它具有以前由 Qt 5.15 之前的
Visual Studio Generators¶
当使用 Visual Studio generators
时,CMake 会生成 PRE_BUILD
custom command
而不是 The <ORIGIN>_autogen target custom target
(用于 AUTOMOC
和 AUTOUIC
)。但这并非总能实现,将使用 The <ORIGIN>_autogen target custom target
,如果发生以下任一情况:
<ORIGIN>
目标依赖于GENERATED
文件,而这些文件没有通过AUTOMOC
和AUTOUIC
排除由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)