CMake和Qt5 AUTOMOC错误

时间:2013-11-08 18:49:58

标签: qt cmake qt5 moc automocking

我有一个使用Qt5的项目,我有一个CMakeLists.txt文件,我用它来创建Visual Studio解决方案。

这是我的CMakeLists.txt

的摘录
cmake_policy(SET CMP0020 NEW)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 REQUIRED COMPONENTS core widgets)

set(COMMON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/src)

include_directories( ${Boost_INCLUDE_DIRS}
    ${COMMON_INCLUDE_DIR}
)


file(GLOB_RECURSE COMMON_SOURCE "*.hpp" "*.cpp")
add_library(${PROJECT_NAME} ${COMMON_SOURCE})
qt5_use_modules(${PROJECT_NAME} Widgets)

当我尝试编译代码时,它返回以下错误:

>AUTOMOC : error : C:/Users/.../Projects/MyProject/build/MyProjects_automoc.cpp The file includes the moc file "moc_MyFile.cpp", but could not find header "MyFile{.h,.hh,.h++,.hm,.hpp,.hxx,.in,.txx}" in C:/Users/.../Projects/MyProject/build/

moc文件已自动生成,标题不在build文件夹中,但位于src目录中的文件夹中。

如何修复此错误?

1 个答案:

答案 0 :(得分:4)

最好添加:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

使用AUTOMOC功能时。此外,这个

include_directories(
  ...
  ${QT_USE_FILE}
  ...
)

是个错误。它应该是:

include(${QT_USE_FILE})

最后,您应该只明确地将源推送到编译,但不是标头!如文档中所述:

  • 如果Q_OBJECT中有foo.h(即在头文件中声明QObject), 然后在相应的foo.cpp 不要忘记添加#include "moc_foo.cpp",最好是在最后 该文件;

  • 如果Q_OBJECT中有foo.cpp(即在源文件中声明QObject), 然后,再次,在foo.cpp本身 不要忘记添加#include "foo.moc",最好是在最后 该文件。

因此,请遵循这些建议并更改

file(GLOB_RECURSE COMMON_SOURCE "*.hpp" "*.cpp")

file(GLOB_RECURSE COMMON_SOURCE "*.cpp")

您还可以找到 my other answer 。您的问题非常相似,因此我建议您在下次发布之前进行更好的搜索。

祝你好运。