CMake和Qt5 AUTOMOC错误

Mav*_*rik 3 qt cmake moc automocking qt5

我有一个使用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)
Run Code Online (Sandbox Code Playgroud)

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

>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/
Run Code Online (Sandbox Code Playgroud)

moc文件已自动生成,并且标题不在build文件夹中,而是在src目录中的文件夹中。

如何解决此错误?

Ale*_*aev 5

最好添加:

set(CMAKE_INCLUDE_CURRENT_DIR ON)
Run Code Online (Sandbox Code Playgroud)

使用AUTOMOC功能时。此外,这

include_directories(
  ...
  ${QT_USE_FILE}
  ...
)
Run Code Online (Sandbox Code Playgroud)

是一个错误。它应该是:

include(${QT_USE_FILE})
Run Code Online (Sandbox Code Playgroud)

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

  • 如果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")
Run Code Online (Sandbox Code Playgroud)

file(GLOB_RECURSE COMMON_SOURCE "*.cpp")
Run Code Online (Sandbox Code Playgroud)

您也可以找到其他答案有帮助。您的问题非常相似,因此建议您在下一次发布之前进行更好的搜索。

祝好运。

  • 谢谢,第一个建议似乎可行。关于第二个我编辑的问题,我没有包含“ $ {QT_USE_FILE}”,这是一个复制错误。似乎也不需要`include($ {QT_USE_FILE})`。`qt5_use_modules($ {PROJECT_NAME}小部件)`应该照顾好它。对于最后一个建议,我必须包括所有源,因为我想在Visual Studio中对其进行操作。 (2认同)
  • 在我看来,将 moc_foo.cpp 添加到您编写的每个源中似乎比添加头文件作为 CMake 目标的源更糟糕。理想情况下,CMake 应该对包含目录中的文件运行 AUTOMOC,但这似乎仍然没有发生(CMake 3.15)。 (2认同)