CMake和Qt5的AUTOMOC错误

5

我有一个使用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/

你正在使用哪个版本的CMake? - Tab
如果您将所有文件放在包含CMakeList.txt的目录中,并使用以下命令:INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ),那么它是否能够正常工作? - Tab
1个回答

9

添加以下内容是有益的:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

使用AUTOMOC特性时,此外,这个
include_directories(
  ...
  ${QT_USE_FILE}
  ...
)

这是一个错误。正确应该是:
include(${QT_USE_FILE})

最后,你只应该将源代码明确地推送到编译中,但不要推送头文件!根据文档所述:

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

  • 如果foo.cpp中有Q_OBJECT(即在源文件中声明了QObject), 同样,在foo.cpp本身中 不要忘记添加#include "foo.moc",最好在文件末尾。

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

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

to

file(GLOB_RECURSE COMMON_SOURCE "*.cpp")

您还可以找到我的其他答案,这可能会有所帮助。您的问题非常相似,所以我建议下次在发布前更好地搜索。

祝你好运。


2
谢谢,第一个建议似乎有效。关于第二个建议,我编辑了问题,没有包括 ${QT_USE_FILE},那是复制错误。似乎也不需要 include(${QT_USE_FILE})qt5_use_modules(${PROJECT_NAME} Widgets) 应该会处理它。对于最后一个建议,我必须包含所有源代码,因为我想在 Visual Studio 中操作它们。 - Maverik
然而,在头文件中有Q_OBJECT应该足以创建moc文件。如果头文件与源文件在同一个文件夹中,CMake也会表现出这种行为。对于不在源代码目录中的头文件,qmake也会这样做...这只是CMake似乎不支持的一些事情(谈论3.9)。 - IceFire
2
将moc_foo.cpp添加到每个源文件中,对我来说比将头文件作为CMake目标的源文件添加要糟糕得多。理想情况下,CMake应该在包含目录中的文件上运行AUTOMOC,但似乎仍未发生(CMake 3.15)。 - Jan Hošek
同意@JanHošek的观点。虽然如果CMake自动处理头文件的MOC会更好,但是显式地向目标提供头文件比手动包含moc源代码更好。在这种方法中,似乎CMAKE_INCLUDE_CURRENT_DIR没有任何效果。 - Burak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接