Your script has several errors, also a few things can be improved. After changes it will be looks like:
cmake_minimum_required(VERSION 3.0.2)
project(MyProject)
find_package(Qt5Widgets)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_library(mainwindow mainwindow.cpp)
target_link_libraries (mainwindow Qt5::Widgets)
add_executable(MyProject main.cpp)
target_link_libraries (MyProject mainwindow)
Errors:
-
Wrong
add_executabledirective. You try to add a library, but for this purpose you need to usetarget_link_libraries. So instead of:add_executable(Cmake main.cpp mainwindow)You need:
add_executable(Cmake main.cpp) target_link_libraries (Cmake mainwindow) -
And one more mistake is missing
*.cppfiles in theadd_librarydirective:add_library(mainwindow mainwindow.cpp ${Cmake_hdr_moc} ${Cmake_form_hdr})
Recommendations:
-
Also setting version of
CMakewould be appropriate. If you useCMAKE_AUTOMOCyou need a version not less than 2.8.6, and if you useCMAKE_AUTOUICyou need a version not less than 3.0.2:cmake_minimum_required(VERSION 3.0.2) -
Using
qt5_wrap_cppwithCMAKE_AUTOMOCisn’t necessary. -
When you use
CMAKE_AUTOMOCusageCMAKE_AUTOUICinstead ofqt5_wrap_uiwill be more appropriate. -
This script is correct for the project with the following structure in the file system:
Project ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h └── mainwindow.uiIf you have another structure you should use
include_directoriesas was mentioned by @steveire. -
(UPD) Since, I’ve written this answer, I suggested it several times for beginners who try to meet with
QtthroughCMake. They complain of an inappropriate name of the project – “Cmake”. For beginners who just meet withCMakeis difficult to realize where cmake – is just part of the project name (and isn’t mandatory) and where cmake is part of a directive (and is mandatory). So I’d like to replace the name of the project from “Cmake” to “MyProject”. This reduces connection between question and answer, but on the other hand this makes the answer more friendly for beginners. -
(UPD) As was mentioned by @Erik Sjölund
qt5_use_modulesis obsolete andtarget_link_librariesshould be used instead.
Note: Personally I have had unsuccessful experience with CMAKE_AUTOMOC; it’s good for a simple project with plain structure. I’ve had problems with a case when my include files were stored into a separate directory:
.
├── include
│ └── QtClass.h
└── src
└── QtClass.cpp
And when files with the same name were into different subdirectories:
.
├── NamespaceA
│ ├── QtClass.cpp
│ └── QtClass.h
└── NamespaceB
├── QtClass.cpp
└── QtClass.h
Finally:
This is a suggestion based on my personal opinion, but I’d like to propose more explicit version of the script without usage of CMAKE_AUTOMOC and CMAKE_AUTOUIC, it’s more verbose but in other hand you have more control:
cmake_minimum_required (VERSION 2.8.12)
project (MyProject)
find_package (Qt5Widgets)
set (MyProjectLib_src ${PROJECT_SOURCE_DIR}/mainwindow.cpp)
set (MyProjectLib_hdr ${PROJECT_SOURCE_DIR}/mainwindow.h)
set (MyProjectLib_ui ${PROJECT_SOURCE_DIR}/mainwindow.ui)
set (MyProjectBin_src ${PROJECT_SOURCE_DIR}/main.cpp)
qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr})
qt5_wrap_ui (MyProjectLib_ui_moc ${MyProjectLib_ui})
include_directories (${PROJECT_SOURCE_DIR})
include_directories (${PROJECT_BINARY_DIR})
add_library (MyProjectLib SHARED
${MyProjectLib_src}
${MyProjectLib_hdr_moc}
${MyProjectLib_ui_moc}
)
target_link_libraries (MyProjectLib Qt5::Widgets)
add_executable(MyProject ${MyProjectBin_src})
target_link_libraries (MyProject MyProjectLib)
The complete version of the projects source code is available at GitLab.