CMake and Qt5 AUTOMOC error

Maverik picture Maverik · Nov 8, 2013 · Viewed 16k times · Source

I have a project which uses Qt5 and I have a CMakeLists.txt file that I use for creating the Visual Studio Solution.

This is an excerpt of my 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)

When I try to compile the code it returns the following error:

>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/

The moc file have been auto-generated and the header is not in the build folder, but in a folder locate in the src directory.

How is possible to fix this error?

Answer

Alexander Shukaev picture Alexander Shukaev · Nov 13, 2013

It is good to add:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

when using the AUTOMOC feature. Furthermore, this

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

is a mistake. It should rather be:

include(${QT_USE_FILE})

Finally, you should only explicitly push sources to compilation, but not headers! As stated in the documentation:

  • If Q_OBJECT is in the foo.h (i.e. QObject is declared in the header file), then in the corresponding foo.cpp don't forget to add #include "moc_foo.cpp", preferably at the end of the file;

  • If Q_OBJECT is in the foo.cpp (i.e. QObject is declared in the source file), then, again, in the foo.cpp itself don't forget to add #include "foo.moc", preferably at the end of the file.

Therefore, follow these recommendations and change

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

to

file(GLOB_RECURSE COMMON_SOURCE "*.cpp")

You could also find my other answer helpful. Your question is very similar, so I'd recommend to search better before posting next time.

Good luck.