CMake可以查找并使用Qt4和Qt5库。Qt4库由CMake附带的 FindQt4 “查找模块”(find-module)查找,而Qt5库通过Qt5附带的“配置文件包”(Config-file Packages)查找。更多关于CMake包(CMake Packages)参阅 cmake-packages,Qt CMake 手册参阅 the Qt cmake manual。
Qt4和Qt5可以一起用在CMake构建系统(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目标可能无法同时链接到Qt4和Qt5,如果尝试这样做可能会因为目标依赖关系而导致发出诊断提示。
Qt依赖于一些捆绑的代码生成工具。比如元对象代码生成使用moc
,部件的布局和填充使用uic
,虚拟文件系统生成使用rcc
。如果满足适当的条件,这些工具可能会被 cmake 自动调用。自动工具调用可用于Qt4和Qt5。
AUTOMOC 目标属性控制 CMake 是否检查目标中的C++文件以确定它们是否需要运行moc
,并创建规则以在合适的时候执行moc
。
如果在头文件中找到 AUTOMOC_MACRO_NAMES 宏,moc
将在此文件上运行。如果在C++实现文件中找到此宏,moc输出会放在一个根据Qt约定的名为moc_
的文件中。moc_
必须由用户使用预处理器#include
在C++实现文件中包含。
moc_*.cpp
和*.moc
文件将会生成在
目录中,该目录将被自动地添加到目标的包含目录(INCLUDE_DIRECTORIES)中。
AUTOGEN_BUILD_DIR/include_
。不包含moc_
的文件为避免名称冲突将在自定义文件中生成,该文件要么名为
,要么名为
。
moc
命令行会使用它所调用的目标的 COMPILE_DEFINITIONS 和 INCLUDE_DIRECTORIES 属性以及相应的构建配置。
可以通过设置 CMAKE_AUTOMOC 变量来为所有目标预先设置 AUTOMOC 目标属性。可以通过填充 AUTOMOC_MOC_OPTIONS 目标属性来设置要传递给moc
的选项。可以通过填充 CMAKE_AUTOMOC_MOC_OPTIONS 来预先设置所有目标的moc
选项。
可以将要搜索的额外的宏名称添加到 AUTOMOC_MACRO_NAMES。
通过使用 AUTOMOC_DEPEND_FILTERS,可以从源代码中提取其它moc
依赖项文件名。
C++源文件可以通过启用 SKIP_AUTOMOC 或者更广泛的 SKIP_AUTOGEN 来从 AUTOMOC 处理中排除。
AUTOUIC 目标属性控制 CMake 是否审查目标中的C++文件以确定它们是否需要运行uic
,并在适当的时候创建规则来执行uic
。
如果找到与 ui_
匹配的#include
预处理指令,并且存在
文件,则执行uic
来生成相应的文件。.ui
文件将在以下位置查找:
/.ui
/.ui
/.ui
/.ui
其中:
为C++文件所在目录,AUTOUIC_SEARCH_PATHS 是额外的搜索路径列表。
生成的ui_*.h
文件放在
目录中,该目录将自动添加到目标的包含目录(INCLUDE_DIRECTORIES)中。
AUTOGEN_BUILD_DIR/include_
。通过设置 CMAKE_AUTOUIC 变量,可以为所有目标预先设置 AUTOUIC 目标属性。可通过填充 AUTOUIC_OPTIONS 目标属性来设置传递给uic
的选项。可以通过填充 CMAKE_AUTOUIC_OPTIONS 变量来为所有目标预先设置选项。AUTOUIC_OPTIONS 源文件属性可以设置在
上来为文件设置特定选项,这将覆盖来自 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.
# KI18n 使用 tr2i18n() 函数替代 tr()。该函数在 klocalizedstring.h 头文件中声明。
set(autouic_options
-tr tr2i18n
-include klocalizedstring.h
)
set_property(TARGET KI18n APPEND PROPERTY
INTERFACE_AUTOUIC_OPTIONS ${autouic_options}
)
当 AUTOUIC 运行uic
时,链接到从上游(upstream)导出的目标的项目会自动使用适当的选项,作为链接到 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 目标属性控制CMake是否创建规则以在适当的时候对后缀为.qrc
的源文件执行rcc
。
add_executable(myexe main.cpp resource_file.qrc)
可通过设置 CMAKE_AUTORCC 变量来为所有目标预先设置 AUTORCC 目标属性。可通过填充 AUTORCC_OPTIONS 目标属性来设置传递给rcc
的选项。可通过填充 CMAKE_AUTORCC_OPTIONS 变量来为所有目标预先设置rcc
选项。可在
文件上设置 AUTORCC_OPTIONS 源文件属性来为文件设置特定的选项,这将覆盖来自 AUTORCC_OPTIONS 的目标属性。
可通过启用 SKIP_AUTORCC 或更广泛的 SKIP_AUTOGEN 来从 AUTORCC 处理中排除源文件。
moc
和uic
工具作为由CMake生成的合成的
自定义目标(custom target)的一部分被执行。默认情况下,
目标继承
目标的依赖项(参阅 AUTOGEN_ORIGIN_DEPENDS)。可通过向 AUTOGEN_TARGET_DEPENDS 目标属性添加目标依赖项来为
目标添加目标依赖项。
当使用 Visual Studio generators 时,CMake生成一个预构建(PRE_BUILD
)自定义命令(custom command)来代替
自定义目标(custom target)(用于 AUTOMOC 和 AUTOUIC)。但这并不总是可能的,当以下情况之一时,使用
自定义目标(custom target):
目标依赖 GENERATED 文件,且这些文件没有被 SKIP_AUTOMOC、SKIP_AUTOUIC、SKIP_AUTOGEN 或 CMP0071 从 AUTOMOC 和 AUTOUIC 中排除;QtGui库的Qt4和Qt5导入(IMPORTED)目标指定Qt附带的qtmain.lib
静态库将由启用 WIN32_EXECUTABLE 的所有相关可执行文件链接。若要禁止此行为,基于Qt5的目标可启用 QT5_NO_LINK_QTMAIN
目标属性,基于Qt4的目标可启用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)