cmake-qt(7)¶
简介¶
CMake 可以查找和使用 Qt 4、Qt 5 和 Qt 6 库。Qt 4 库通过 CMake 附带的 FindQt4 查找模块找到,而 Qt 5 和 Qt 6 库则使用 Qt 5 和 Qt 6 附带的“Config-file Packages”找到。有关 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 依赖于一些内置工具进行代码生成,例如用于元对象代码生成的 moc,用于窗口小部件布局和填充的 uic,以及用于虚拟文件系统内容生成的 rcc。如果满足适当的条件,cmake(1) 可能会自动调用这些工具。自动工具调用可与 Qt 版本 4 到 6 一起使用。
AUTOMOC¶
目标属性 AUTOMOC 控制 cmake(1) 是否检查目标中的 C++ 文件,以确定它们是否需要运行 moc,并创建相应的规则以在适当的时间执行 moc。
如果在头文件中找到来自 AUTOMOC_MACRO_NAMES 的宏,则会在该文件上运行 moc。结果将放入一个命名为 moc_<basename>.cpp 的文件中。如果宏在 C++ 实现文件中找到,则 moc 输出将遵循 Qt 约定,放入一个命名为 <basename>.moc 的文件中。用户必须使用预处理器 #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 目标属性。
目标属性 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 中的选项。
目标可以填充 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}
)
消耗方项目链接到从上游导出的目标时,在 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 处理。
The <ORIGIN>_autogen target¶
moc 和 uic 工具作为 CMake 生成的合成 <ORIGIN>_autogen 自定义目标 的一部分执行。默认情况下,<ORIGIN>_autogen 目标继承 <ORIGIN> 目标的依赖项(请参阅 AUTOGEN_ORIGIN_DEPENDS)。可以通过将依赖项添加到 AUTOGEN_TARGET_DEPENDS 目标属性来将目标依赖项添加到 <ORIGIN>_autogen 目标。
注意
如果使用 Qt 5.15 或更高版本,并且生成器是 Ninja 或 Makefile Generators,请参阅 The <ORIGIN>_autogen_timestamp_deps target。
The <ORIGIN>_autogen_timestamp_deps target¶
如果使用 Qt 5.15 或更高版本,并且生成器是 Ninja 或 Makefile Generators,则除了 <ORIGIN>_autogen 目标之外,还会创建 <ORIGIN>_autogen_timestamp_deps 目标。此目标没有源文件或要执行的命令,但它具有在 Qt 5.15 之前的 <ORIGIN>_autogen 目标中继承的依赖项。这些依赖项将作为自定义命令的顺序依赖项列表,而不会强制自定义命令重新执行。
Visual Studio Generators¶
使用 Visual Studio Generators 时,CMake 会生成一个 PRE_BUILD 自定义命令,而不是(对于 AUTOMOC 和 AUTOUIC) <ORIGIN>_autogen 自定义目标。但这并非总是可能,并且会使用 <ORIGIN>_autogen 自定义目标,当出现以下情况之一时:
<ORIGIN>目标依赖于生成的文件,这些文件未被AUTOMOC和AUTOUIC排除(通过SKIP_AUTOMOC、SKIP_AUTOUIC、SKIP_AUTOGEN或CMP0071)AUTOGEN_TARGET_DEPENDS列出了一个源文件
Visual Studio Generators¶
Qt 4 和 5 的 导入目标 对于 QtGui 库指定,qtmain.lib 静态库(随 Qt 一起提供)将由所有启用 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)