【问题标题】:CMake and Qt5 AUTOMOC errorCMake 和 Qt5 AUTOMOC 错误
【发布时间】:2013-11-08 18:49:57
【问题描述】:

我有一个使用 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 目录下的文件夹中。

如何解决这个错误?

【问题讨论】:

  • 您使用的是什么版本的 CMake?
  • 如果将所有文件都放在 CMakeList.txt 所在的 dir 和 INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) 中,它是否工作良好`

标签: qt cmake qt5 moc automocking


【解决方案1】:

补充一下就好:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

使用AUTOMOC 功能时。此外,这

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

是一个错误。应该是:

include(${QT_USE_FILE})

最后,您应该只将源显式推送到编译,而不是标头!如文档中所述:

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

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

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

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

file(GLOB_RECURSE COMMON_SOURCE "*.cpp")

my other answer 对您也有帮助。您的问题非常相似,因此我建议您在下次发布之前更好地搜索。

祝你好运。

【讨论】:

  • 谢谢,第一个建议似乎有效。关于我第二次编辑问题,我没有包括${QT_USE_FILE},这是一个复制错误。似乎include(${QT_USE_FILE}) 也没有必要。 qt5_use_modules(${PROJECT_NAME} Widgets) 应该照顾它。对于最后一个建议,我必须包含所有源代码,因为我想在 Visual Studio 中对它们进行操作。
  • 但是,在头文件中包含 Q_OBJECT 应该足以创建 moc 文件。如果头文件与源文件位于相同的文件夹中,CMake 也会以这种方式运行。 qmake 也会以这种方式处理源外标头...这只是 CMake 似乎不支持的东西(谈到 3.9)
  • 将 moc_foo.cpp 添加到您编写的每个源对我来说似乎比将头文件作为源添加到 CMake 目标更糟糕。理想情况下,CMake 应该在包含目录中的文件上运行 AUTOMOC,但这似乎仍然没有发生(CMake 3.15)。
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多