cmake-qt(7)¶
介绍¶
CMake 可以找到并使用 Qt 4 和 Qt 5 库。 Qt 4 库是通过 CMake 附带的:module:FindQt4 查找模块找到的,而 Qt 5 库是使用 Qt 5 附带的“配置文件包”找到的。参见:manual:cmake-packages(7 ) 有关 CMake 包的更多信息,请参阅`Qt cmake 手册 <https://contribute.qt-project.org/doc/qt-5/cmake-manual.html>`_ 适用于您的 Qt 版本。
Qt 4 和 Qt 5 可以在同一个 CMake buildsystem 中一起使用:
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
project(Qt4And5)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS Widgets DBus REQUIRED)
add_executable(publisher publisher.cpp)
target_link_libraries(publisher Qt5::Widgets Qt5::DBus)
find_package(Qt4 REQUIRED)
add_executable(subscriber subscriber.cpp)
target_link_libraries(subscriber Qt4::QtGui Qt4::QtDBus)
CMake 目标可能不会链接到 Qt 4 和 Qt 5。如果尝试这样做或从传递目标依赖性评估中得到结果,则会发出诊断。
Qt 构建工具¶
Qt 依赖于一些捆绑的代码生成工具,例如用于元对象代码生成的``moc``,用于小部件布局和填充的``uic``,以及用于虚拟文件系统内容生成的``rcc``。如果满足适当的条件,这些工具可能会被 cmake(1) 自动调用。自动工具调用可以与 Qt 4 和 Qt 5 一起使用。
奥托莫克¶
AUTOMOC 目标属性控制 cmake(1) 是否检查目标中的 C++ 文件以确定它们是否需要运行 moc,并创建规则来执行 ``moc ``在适当的时候。
如果在头文件中找到来自 AUTOMOC_MACRO_NAMES 的宏,则将在该文件上运行 moc。结果将被放入一个根据 moc_<basename>.cpp 命名的文件中。如果在 C++ 实现文件中找到该宏,则 moc 输出将按照 Qt 约定放入根据 <basename>.moc 命名的文件中。 <basename>.moc 必须由用户使用预处理器``#include`` 包含在 C++ 实现文件中。
包含的``moc_*.cpp`` 和``*.moc`` 文件将在``<AUTOGEN_BUILD_DIR>/include`` 目录中生成,该目录会自动添加到目标的 INCLUDE_DIRECTORIES。
这与 CMake 3.7 及以下版本不同;有关详细信息,请参阅他们的文档。
对于
多配置生成器,包含目录为<AUTOGEN_BUILD_DIR>/include_<CONFIG>。请参阅:prop_tgt:AUTOGEN_BUILD_DIR。
不包括 moc_<basename>.cpp 文件将在自定义文件夹中生成以避免名称冲突,并包含在编译到目标中的单独文件中,命名为 <AUTOGEN_BUILD_DIR>/mocs_compilation.cpp 或``<AUTOGEN_BUILD_DIR>/mocs_compilation_$<CONFIG>.cpp``。
请参阅:prop_tgt: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,可以从 AUTOMOC 处理中排除源 C++ 文件。
自动档¶
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>/<路径><basename>.ui
其中 <source_dir> 是 C++ 文件的目录,而 AUTOUIC_SEARCH_PATHS 是附加搜索路径的列表。
生成的 ui_*.h 文件放置在``<AUTOGEN_BUILD_DIR>/include`` 目录中,该目录会自动添加到目标的 INCLUDE_DIRECTORIES。
这与 CMake 3.7 及以下版本不同;有关详细信息,请参阅他们的文档。
对于
多配置生成器,包含目录为<AUTOGEN_BUILD_DIR>/include_<CONFIG>。请参阅:prop_tgt: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 Qt5::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 变量以预先设置所有以下目标的选项。 AUTORCC_OPTIONS 源文件属性可以在 <name>.qrc 文件上设置,以设置文件的特定选项。这会覆盖来自 AUTORCC_OPTIONS 目标属性的选项。
通过启用 SKIP_AUTORCC 或更广泛的 SKIP_AUTOGEN 可以将源文件排除在 AUTORCC 处理之外。
<ORIGIN>_autogen 目标¶
moc 和 uic 工具作为合成的 <ORIGIN>_autogen 的一部分执行 自定义目标 由 CMake 生成。默认情况下,<ORIGIN>_autogen 目标继承了``<ORIGIN>`` 目标的依赖项(参见:prop_tgt:AUTOGEN_ORIGIN_DEPENDS)。通过将目标依赖项添加到 AUTOGEN_TARGET_DEPENDS 目标属性,可以将目标依赖项添加到 <ORIGIN>_autogen 目标。
Visual Studio 生成器¶
使用 Visual Studio 生成器 时,CMake 生成一个 PRE_BUILD 自定义命令 而不是 <ORIGIN>_autogen 自定义目标 <add_custom_target>`(用于 :prop_tgt:`AUTOMOC() 和 AUTOUIC)。这并不总是可行的,并且使用``<ORIGIN>_autogen``:command:`custom target
<ORIGIN>目标取决于GENERATED文件,这些文件没有被SKIP_AUTOMOC排除在AUTOMOC和AUTOUIC之外`,SKIP_AUTOGEN或CMP0071AUTOGEN_TARGET_DEPENDS列出源文件
Windows 上的 qtmain.lib¶
QtGui 库的 Qt 4 和 5:prop_tgt:IMPORTED 目标指定 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)