【问题标题】:Qt, CMake and Visual Studio BehaviorQt、CMake 和 Visual Studio 行为
【发布时间】:2019-07-01 17:58:05
【问题描述】:

我正在将我的一些 Qt 项目移植到 CMake 中,以使它们在不同的 IDE 中更加灵活。
CMake 唯一可悲的部分是,当我生成 VS solution 时,它无法与 Qt VS 扩展一起使用。
例如,如果我更改了.ui 文件,我需要重新构建项目以便在 GUI 中看到与使用 VS Extension 生成的项目相比的更改,它会自动识别更改并重新moc拥有.ui 文件的类,无需重新构建整个项目。
如果我查看 VS Extension 在 .vcxproj 文件中生成的项目配置,它会添加 ItemDefinitionGroup 一些项目,如下所示:

并且项目中包含的每个类/文件都将根据类的类型进行标记(QtMocQtUicQtRcc):

可能这就是 Qt VS 扩展识别如何处理每个文件的原因,所以如果它是 QtUic,那么它会检查 .ui 文件中是否存在任何更改,如果有新的更改,它将重新编译 ui 文件,然后 moc 属于 .ui 文件的类,然后才重新编译拥有 .ui 文件的实际类。

总之,有没有什么方法可以让 CMake 生成一个类似于我在 CMake 中选择 VS 生成器时生成的一个 Qt VS Extension 的项目? 我猜 CMake 在内部不支持这一点,因为它们倾向于抽象所有这些行为以使所有 VS 项目尽可能通用,无论使用什么框架,但 CMake 确实有支持 Qt 的标志,例如:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

所以我假设实施起来不会有太多工作。
可能我最好的选择是分叉 CMake 并自己重新实现这种行为? 伪例子:

if CMAKE_AUTOMOC == ON & CMAKE_VS_EXT == ON
    Do some custom changes to the .vcxproj file
endif

抱歉,这篇文章很长,但我们将不胜感激任何想法和帮助。谢谢!

【问题讨论】:

  • 您能否发布您尝试处理 UI 文件和 MOC 文件的 CMakeLists.txt 的相关部分?我们总是使用 CMake 生成我们的解决方案,并且没有注意到这种行为。
  • 我想你可以看看这里:github.com/giladreich/QtDirect3D/blob/master/src/demo/… 但是消费者端没有处理,这一切都在 CMake 端处理(它生成项目文件的方式)。
  • @vre 如果我错了,请纠正我,但是当你说你没有注意到这种行为时,你说的是除非我重建我的项目,否则 UI 上的更改不会发生的部分?
  • CMake 生成的 VS 解决方案不会自动运行 UIC 或 RCC 或 MOC。它总是在项目重建时发生。
  • @vre 感谢您的建议。这正是为什么我认为需要在 CMake 方面进行一些进一步的实现,以使其与 Qt VS Addin 一起正常工作,Qt VS Addin 运行良好且使用起来非常方便。

标签: c++ qt cmake qt-vs-addin


【解决方案1】:

由于评论太多(代码),所以我将其作为答案。

AFAIK 您不必将生成的文件包含到您的add_executable 调用中。这是 CMake automoc 功能在幕后所做的事情。

CMakeLists.txt 文件中的典型序列如下所示:

include_directories(${CMAKE_CURRENT_BINARY_DIR})

file(GLOB_RECURSE SOURCES sources/*.cpp)
file(GLOB_RECURSE HEADERS include/*.h)
file(GLOB_RECURSE FORMS ui/*.ui)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
file(GLOB_RECURSE RESOURCES resources/*.qrc)

set(CMAKE_AUTOMOC TRUE)
set(CMAKE_AUTOUIC TRUE)
set(CMAKE_AUTORCC TRUE)

add_library(theLib ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})

target_include_directories(theLib BEFORE
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
)

【讨论】:

  • 谢谢。我添加生成的文件(即 ui_*.h 等)的唯一原因,因为最初是 Qt VS Addin 执行此操作,如果您想查看已生成的文件,这很好。但正如我在之前的评论中所说,我希望 CMake 能够生成适当的 VS 项目,以便更好地与 Qt 插件集成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多