Не могу включить ui-файл из связанной библиотеки, используя автозапуск CMake - PullRequest
0 голосов
/ 29 марта 2020

У меня есть проект 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 -директории), но Я думаю, что этот пример облегчает понимание структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...