У меня есть проект CMake, который я упростил, чтобы найти root моей ошибки. Проект имеет единственный файл CMakeLists.txt, который добавляет библиотеку и исполняемый файл, который ссылается на библиотеку. И библиотека, и исполняемый файл включают в себя пользовательские файлы. Для генерации заголовочных файлов ui-файлов используется переменная CMAKE_AUTOUIC
. И библиотека, и исполняемый файл могут включать свои собственные ui-файлы: они находятся внутри подкаталога [projectname]_autogen\include_Debug
моего каталога сборки. Тем не менее, другой файл в моем исполняемом файле включает в себя файл из библиотеки, который, в свою очередь, включает в себя UI-файл. Здесь я получаю сообщение об ошибке:
Error C1083 Cannot open include file: 'ui_MainWidget.h': No such file or directory QtGUI
\QtGUI\src\QtWidgets\include\MainWidget.h 5
Мой проект выглядит так:
cmake_minimum_required (VERSION 3.14 FATAL_ERROR)
project(QtGUI)
find_package(Qt5 COMPONENTS Widgets Core Gui REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
add_library(QtWidgets
QtWidgets/source/MainWidget.cpp
QtWidgets/include/MainWidget.h
QtWidgets/include/MainWidget.ui
)
target_link_libraries(QtWidgets
PUBLIC
Qt5::Widgets
Qt5::Core
Qt5::Gui
)
target_include_directories(QtWidgets
PUBLIC
QtWidgets/include
)
add_executable(${PROJECT_NAME}
Main/include/MainWindow.h
Main/include/MainWindow.ui
Main/source/MainWindow.cpp
Main/source/Main.cpp
)
target_link_libraries(${PROJECT_NAME}
PUBLIC
QtWidgets
)
target_include_directories(${PROJECT_NAME}
PUBLIC
Main/include
)
И файл MainWindow.cpp
из проекта QtGUI
, в котором возникает ошибка:
#include "MainWindow.h" // inside this project
#include "MainWidget.h" // inside the linked library 'QtWidgets'
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
...
MainWidget.h
выглядит так
// Qt Includes
#include <ui_MainWidget.h> // inside this project
#include <QWidget>
namespace Ui
{
class MainWidget;
}
class MainWidget : public QWidget
{
Q_OBJECT
public:
...
Что мне здесь не хватает? Я знаю, что было бы чище разделить CMakeLists.txt и иметь собственный CMakeLists.txt внутри связанной библиотеки и переместить туда материал add_library
(и сделать то же самое для исполняемого файла, например, application
-директории), но Я думаю, что этот пример облегчает понимание структуры.