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

CMake: 'AUTOMOC' feature skips sources of executable targets?

本文关键字:目标 可执行 AUTOMOC 功能 CMake      更新时间:2023-10-16

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

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

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

切换到(相对)新的AUTOMOC特性时,通过在顶部CMakeLists.txt添加以下内容:

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

所有静态/共享库的源代码都是AUTOMOC 'ed的。但是,可执行目标(本例中为E)的源永远不会是AUTOMOC 'ed。

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

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

更新

我找到原因了,讨论在CMake邮件列表

总之,问题是E没有明确地包括Qt模块:

find_package(Qt4 ...)

和隐式:

find_package(MyPrecious ...)

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

因此,像QT_VERSION_*这样的非缓存变量不存在于E子项目的范围内,因此AUTOMOC特性不能正常工作。我得说,这是一个令人讨厌的陷阱。

相关文章: