【问题标题】:How to make CMake use AUTOMOC without find_package?如何让 CMake 在没有 find_package 的情况下使用 AUTOMOC?
【发布时间】:2021-12-17 15:12:28
【问题描述】:

目前,我有 Qt dll 并将标头作为依赖项包含在我的 repo 中。我想利用 CMake 的 CMAKE_AUTOMOC 功能提供 moc.exe 二进制文件以及 dll 和包含文件。 CMake 允许为二进制设置自定义路径,但无法使用CMAKE_AUTOMOC 功能。

CMake Warning (dev) in myproj/CMakeLists.txt:
  AUTOGEN: No valid Qt version found for target myproj_QT.  AUTOMOC
  disabled.  Consider adding:

    find_package(Qt<QTVERSION> COMPONENTS Core)

  to your CMakeLists.txt file.

我不想使用find_package 之类的所有东西。我想让依赖管理尽可能简单明了。有没有办法通过我的方法启用 automoc/autouic/autocc 功能?

【问题讨论】:

  • 避免使用find_package 看起来很奇怪(这是在 CMake 中指定依赖关系的最直接和最详细的方式)。但是,根据AUTOMOC 文档,您可以尝试将其中列出的任何一对目录属性设置为对应于QT版本的主要和次要部分。例如,他们有一个设置 Qt5Core_VERSION_MAJOR 和 Qt5Core_VERSION_MINOR 目录属性的示例。
  • @tsyvarev IMO, find_package 看起来很奇怪并且工作方式相同。它在哪里搜索包,它暴露了哪些变量,如何在 windows 平台上搜索?很清楚它在 unix 系统上搜索的位置以及如何获得依赖项(系统范围内,这是问题和开发可移植性问题的另一个来源),但如何在 windows 上安装说 boost 并使其成为 find_package-aware 我不'不知道。我喜欢明确定义依赖关系并且任何开发人员都可以直接拉动而不用担心他们的管理
  • "但是如何在 windows 上安装说 boost 并使其成为 find_package-aware 我不知道。" - 你可以例如设置将Boost的安装前缀添加到变量CMAKE_PREFIX_PATH。此变量影响find_package。
  • 所以,我猜,它要么会因自定义安装路径而破坏其他用户的环境,要么会迫使每个开发人员遵守严格的规则

标签: qt cmake automoc


【解决方案1】:

添加该代码对我有帮助。感谢@Tsyvarev 指出

set(PROGRAM_EXTENSION)
if (WIN32)
    set(PROGRAM_EXTENSION .exe)
endif()
set(AUTOMOC_EXECUTABLE ${CMAKE_SOURCE_DIR}/3rdparty/qt5/bin/${OS}/moc${PROGRAM_EXTENSION})
add_executable(Qt5::moc IMPORTED)
set_target_properties(Qt5::moc PROPERTIES IMPORTED_LOCATION "${AUTOMOC_EXECUTABLE}")
set(Qt5Core_VERSION_MAJOR 5)
set(Qt5Core_VERSION_MINOR 15)
set(CMAKE_AUTOMOC TRUE)

Qt5CoreMacros.cmake 必须放在前面

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多