I have a project which compiles fine when I build it with a .pro
file with QtCreator. I am trying to convert it to cmake
, but have run into an issue.
EDITED WITH MINIMAL REPRODUCIBLE EXAMPLE:
Project folder structure:
src/foo.cpp --> #include "ui_foo.h"
src/bar.cpp --> #include "bar.moc"
inc/foo.h
ui/foo.ui
Expected compilation flow (observed flow when using qmake
):
(1) moc inc/foo.h -o moc_foo.cpp
(2) moc src/bar.cpp -o bar.moc
(3) uic ui/foo.ui -o ui_foo.h
(4) gcc src/foo.cpp -o foo.o
(5) gcc src/bar.cpp -o bar.o
(6) gcc moc_foo.cpp -o moc_foo.o
(7) ld foo.o bar.o moc_foo.o -o foobar
CMakeLists.txt(1):
set(CMAKE_INCLUDE_CURRENT_DIR ON )
set(CMAKE_AUTOMOC ON )
set(CMAKE_AUTOUIC ON )
add_executable(foobar src/foo.cpp src/bar.cpp)
moc_foo.cpp
is not created (step 1 & 6 are missed) and doesn't get added to add_executable
in step 7. Undefined references to vtable occur because of missing object. I think this is because foo.cpp and foo.h are in different folders.
CMakeLists.txt(2):
set(CMAKE_INCLUDE_CURRENT_DIR ON )
qt5_wrap_cpp(foobar_moc inc/foo.h src/bar.cpp)
qt5_wrap_ui (foobar_ui ui/foo.ui)
add_executable(foobar src/foo.cpp src/bar.cpp ${foobar_moc} ${foobar_ui})
moc_bar.cpp
is generated instead of bar.moc
in step 2. I get a compiler error because bar.moc
cannot be found in step 5.