有一个带有顶级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
)。我已经尝试了
AUTOMOC
和MSYS Makefiles
生成器,并且都没有为Ninja
'ing创建目标,而是仅为可执行文件的源创建了(为静态/共享库目标添加了AUTOMOC
'ing目标)。更新资料
我找到了原因,讨论的是CMake mailing list。
最佳答案
总而言之,问题在于E
没有明确包括Qt模块:
find_package(Qt4 ...)
也不隐含:
find_package(MyPrecious ...)
其中
MyPrecious
可能是一些第三方模块,其中包括Qt本身。结果,
QT_VERSION_*
子项目的范围内不存在诸如E
之类的非缓存变量,因此AUTOMOC
功能无法正常运行。我会说令人讨厌的陷阱。有关更多详细信息,请引用CMake mailing list。