3

有一个顶级的中型项目,CMakeLists.txt它定义了一些常见的东西并调用项目中所有工件(子项目)的配置,如下所示:

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

add_subdirectory(components/E)

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

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

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

静态/共享库的所有来源都AUTOMOC很好。但是,可执行目标的源(E在本例中)永远不会AUTOMOC被编辑。

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

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

更新


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

4

1 回答 1

3

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

find_package(Qt4 ...)

也不含蓄地:

find_package(MyPrecious ...)

哪里MyPrecious可能是一些包含 Qt 的第 3 方模块。

结果,子项目QT_VERSION_*范围内不存在诸如非缓存变量之类的变量E,因此AUTOMOC功能无法正常运行。我会说这是一个令人讨厌的陷阱。有关详细信息,请参阅CMake 邮件列表

于 2013-04-30T12:31:22.487 回答