有一个带有顶级CMakeLists.txt的中型项目,它定义了一些常用的东西,并像这样调用项目中所有 Artifact (子项目)的配置:

add_subdirectory(components/A)
add_subdirectory(components/B)
add_subdirectory(components/C)

add_subdirectory(components/E)

Artifact 是静态/共享的库或可执行文件(它们某种程度上相互依赖)。在此示例中,只有一个可执行文件:E。当使用简单的旧qt4_wrap_cpp处理MOC时,所有的配置和构建都非常完美。

当切换到(相对)新的 AUTOMOC 功能时,请在顶部CMakeLists.txt中添加以下内容:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

静态/共享库的所有源都是AUTOMOC'ed很好。但是,从不执行可执行目标的源(在此示例中为E)。

我已经尝试了AUTOMOCMSYS Makefiles生成器,并且都没有为Ninja'ing创建目标,而是仅为可执行文件的源创建了(为静态/共享库目标添加了AUTOMOC'ing目标)。
  • 有没有人经历过?
  • 可能是什么原因?
  • 闻起来像 bug 吗?

  • 更新资料

    我找到了原因,讨论的是CMake mailing list

    最佳答案

    总而言之,问题在于E没有明确包括Qt模块:

    find_package(Qt4 ...)
    

    也不隐含:
    find_package(MyPrecious ...)
    

    其中MyPrecious可能是一些第三方模块,其中包括Qt本身。

    结果,QT_VERSION_*子项目的范围内不存在诸如E之类的非缓存变量,因此AUTOMOC功能无法正常运行。我会说令人讨厌的陷阱。有关更多详细信息,请引用CMake mailing list

    10-07 20:21