CMake系列 cmake-qt

cmake-qt

  • 原文: cmake-qt v3.22
  • 作者: shaoguang (shaoguangcn@163.com)
  • 日期: 2021年10月25日


介绍 (Introduction)

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构建工具 (Qt Build Tools)

Qt依赖于一些捆绑的代码生成工具。比如元对象代码生成使用moc,部件的布局和填充使用uic,虚拟文件系统生成使用rcc。如果满足适当的条件,这些工具可能会被 cmake 自动调用。自动工具调用可用于Qt4和Qt5。

AUTOMOC

AUTOMOC 目标属性控制 CMake 是否检查目标中的C++文件以确定它们是否需要运行moc,并创建规则以在合适的时候执行moc

如果在头文件中找到 AUTOMOC_MACRO_NAMES 宏,moc将在此文件上运行。如果在C++实现文件中找到此宏,moc输出会放在一个根据Qt约定的名为moc_<basename>.moc的文件中。moc_<basename>.moc必须由用户使用预处理器#include在C++实现文件中包含。

moc_*.cpp*.moc文件将会生成在<AUTOGEN_BUILD_DIR>/include目录中,该目录将被自动地添加到目标的包含目录(INCLUDE_DIRECTORIES)中。

不包含moc_<basename>.cpp的文件为避免名称冲突将在自定义文件中生成,该文件要么名为<AUTOGEN_BUILD_DIR>/mocs_compilations.cpp,要么名为<AUTOGEN_BUILD_DIR>/mocs_compilations_$<CONFIG>.cpp

moc命令行会使用它所调用的目标的 COMPILE_DEFINITIONSINCLUDE_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

AUTOUIC 目标属性控制 CMake 是否审查目标中的C++文件以确定它们是否需要运行uic,并在适当的时候创建规则来执行uic

如果找到与 ui_<basename>.h 匹配的#include预处理指令,并且存在<basename>.ui文件,则执行uic来生成相应的文件。.ui文件将在以下位置查找:

  1. <source_dir>/<basename>.ui
  2. <source_dir>/<path>.ui
  3. <AUTOUIC_SEARCH_PATHS>/<basename>.ui
  4. <AUTOUIC_SEARCH_PATHS>/<path>.ui

其中: <source_dir>为C++文件所在目录,AUTOUIC_SEARCH_PATHS 是额外的搜索路径列表。

生成的ui_*.h文件放在 <AUTOGEN_BUILD_DIR>/include 目录中,该目录将自动添加到目标的包含目录(INCLUDE_DIRECTORIES)中。

通过设置 CMAKE_AUTOUIC 变量,可以为所有目标预先设置 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.
# 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

AUTORCC 目标属性控制CMake是否创建规则以在适当的时候对后缀为.qrc的源文件执行rcc

add_executable(myexe main.cpp resource_file.qrc)

可通过设置 CMAKE_AUTORCC 变量来为所有目标预先设置 AUTORCC 目标属性。可通过填充 AUTORCC_OPTIONS 目标属性来设置传递给rcc的选项。可通过填充 CMAKE_AUTORCC_OPTIONS 变量来为所有目标预先设置rcc选项。可在 <name>.qrc 文件上设置 AUTORCC_OPTIONS 源文件属性来为文件设置特定的选项,这将覆盖来自 AUTORCC_OPTIONS 的目标属性。

可通过启用 SKIP_AUTORCC 或更广泛的 SKIP_AUTOGEN 来从 AUTORCC 处理中排除源文件。

<ORIGIN>_autogen目标 (The <ORIGIN>_autogen traget)

mocuic工具作为由CMake生成的合成的<ORIGIN>_autogen自定义目标(custom target)的一部分被执行。默认情况下,<ORIGIN>_autogen目标继承<ORIGIN>目标的依赖项(参阅 AUTOGEN_ORIGIN_DEPENDS)。可通过向 AUTOGEN_TARGET_DEPENDS 目标属性添加目标依赖项来为<ORIGIN>_autogen目标添加目标依赖项。

Visual Studio生成器 (Visual Studio Generators)

当使用 Visual Studio generators 时,CMake生成一个预构建(PRE_BUILD)自定义命令(custom command)来代替<ORIGIN>_autogen自定义目标(custom target)(用于 AUTOMOCAUTOUIC)。但这并不总是可能的,当以下情况之一时,使用 <ORIGIN>_autogen 自定义目标(custom target):

Windows平台上的qtmainlib (qtmain.lib on Windows)

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)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值