cmake + qt + visual studio:构建中的 moc 对象

cmake + qt + visual studio: moc objects on build

我正在使用 cmake + qt + visual studio 来处理一个项目。问题 如果我修改 QT ui 文件,我希望 visual studio 创建新的 moc 对象。如果我只是做一个完整的 build everything works 文件,但如果我只是修改 ui 文件上的某些内容,它不会 "auto moc" 我必须 rebuild整个项目。

我的 cmake 文件非常简单:

cmake_minimum_required(VERSION 3.2)

set(CMAKE_VERBOSE_MAKEFILE ON)

project(main)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt5Widgets)

file(GLOB CPP_FILES *.cpp)

add_executable(main ${CPP_FILES})
target_link_libraries(main Qt5::Widgets)
target_compile_features(main PUBLIC cxx_nullptr)

有谁知道让这个工作的方法(让 visual studio 检测 ui 文件修改和 "auto moc" 修改后的 ui 文件)?

如果您想要正确的依赖关系处理,请先将您的 file(GLOB ...) 替换为明确列出要包含的文件。这也将确保构建为您期望的文件集创建依赖项。 This answer 除了以下原因外,还有更多关于您可能想要这样做的原因的详细信息。

CMake documentation for AUTOUIC 包含此语句:

If a preprocessor #include directive is found which matches ui_<basename>.h, and a <basename>.ui file exists, then uic will be executed to generate the appropriate file.

您能否确认您的 .cpp 源具有遵循此模式的 #include 指令?在你的 file(GLOB ...) 中,你只捕获 .cpp 文件而不是 .h 文件,所以如果你在 headers 中只有 #include 指令,AUTOUIC 可能无法接收它们适当地。自从我使用它以来已经有一段时间了,我不记得如果你只列出 .cpp 文件而不是 add_executable() 调用中的 headers,AUTOUIC 是否仍能找到它们,但它是一些让你尝试的东西。如果您有使用 Q_OBJECT 和 Q_GADGET 宏的 headers,您也可能面临与 AUTOMOC 类似的情况。因此,只需明确列出您提供给 add_executable() 的 .cpp 和 .h 文件,看看是否能解决您的问题。