qt - CMake 和 Qt5 AUTOMOC 错误

标签 qt cmake qt5 moc automocking

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

这是我的 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 文件是自动生成的, header 不在 build 文件夹中,而是在 src 目录中的文件夹中。

如何修复此错误?

最佳答案

最好补充一下:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

使用AUTOMOC功能时。此外,这

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

是一个错误。它应该是:

include(${QT_USE_FILE})

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

  • 如果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 有帮助。您的问题非常相似,所以我建议下次发帖之前先搜索一下。

祝你好运。

关于qt - CMake 和 Qt5 AUTOMOC 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19866424/

相关文章:

qt - Qml 可滑动页面

android - 修复 QML Camera 的帧率并改变它的分辨率

c - 字符串化 CMake 预处理器 token

c++ - 在子目录中调用 target_link_libraries 的替代方法

c++ - 如何在 QT 中通过 C++ 监控 Linux 中的服务?

android - 什么在 Android 上表现更好?使用 Java 或 C++ 编写的应用程序

linux - 为 arm 交叉编译 Qt 的 OpenGL 模块

c++ - QFile 既不读取也不打开我的文件

使用模块为 Fortran-90+ 进行 CMake 并行构建

c++ - Qt 中的多线程