0

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

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

可能这就是让 Qt VS Extension 识别如何处理每个文件的原因,所以如果是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

对不起,很长的帖子,但任何想法和帮助将不胜感激。谢谢!

4

1 回答 1

0

由于评论太多(代码),我把它作为一个答案。

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}>
)
于 2019-02-07T17:30:46.660 回答