CMake:'AUTOMOC'功能跳过可执行目标的来源?

时间:2013-04-29 19:40:38

标签: c++ qt cmake executable moc

有一个中等大小的项目,顶级CMakeLists.txt定义了一些常见内容,并调用项目中所有工件(子项目)的配置,如下所示:

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

add_subdirectory(components/E)

工件是静态/共享库或可执行文件(以某种方式相互依赖)。在此示例中,只有一个可执行文件:E。当使用普通的qt4_wrap_cpp来处理MOC时,一切都可以完美地配置和构建。

通过将以下内容添加到顶部CMakeLists.txt切换到(相对)新的 AUTOMOC 功能时:

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

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

我已经尝试了MSYS MakefilesNinja个生成器,并且两者都不是为AUTOMOC创建目标,而是仅针对可执行文件的源(针对静态/共享库目标) AUTOMOC添加了目标。

  • 有没有人经历过这个?
  • 可能是什么原因?
  • 闻起来像臭虫吗?

更新


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

1 个答案:

答案 0 :(得分:3)

总结一下,问题是E没有明确地包含Qt模块:

find_package(Qt4 ...)

也不暗示:

find_package(MyPrecious ...)

其中MyPrecious可能是某些包含Qt的第三方模块。

因此,QT_VERSION_*子项目范围内不存在E等非缓存变量,因此AUTOMOC功能无法正常运行。我会说,令人讨厌的陷阱。有关详细信息,请参阅CMake mailing list