1

У меня есть проект, который содержит в себе два других (использую subdirs). Вызовом нужных функций из подпроектов занимается класс MainWindow, который находится, как бы, над ними (т.е. это не файл из подпроектов).
Проблема возникает, когда я пытаюсь обратиться с "управляющего" файла к классам подпроектов.
Ошибки:

  • :-1: error: mainwindow.o: in function `MainWindow::slot_showTable()':
  • undefined reference to `Crutch::Crutch()'
  • :-1: error: collect2: error: ld returned 1 exit status


Управляющий файл
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// Здесь подключаются только GUI библиотеки, вроде QPushButton и др.

//namespace Ui {
//class MainWindow;
//}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void slot_showTable(); // В этом слоте происходит обращение к подпроекту
private:
// Тут GUI переменные, вроде QPushButton, QLabel и т.д.  
//    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
//#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
//    ui(new Ui::MainWindow)
{
//    ui->setupUi(this);

    createConnections();
}

void MainWindow::createConnections()
{
// Нужный нам слот
    connect(btnShowBoardTable, &QPushButton::clicked,
            this, &MainWindow::slot_showTable);
    ...
}

#include "subproject/crutch.h"
void MainWindow::slot_showTable()
{
    Crutch *s = new Crutch(); // Здесь и появляется ошибка. Если попытаться обратиться к любому методу класса, то ошибка появляется и на этот метод тоже
}

Файл, находящийся в подпроекте
crutch.h

// Этот файл находится в подпроекте
#ifndef CRUTCH_H
#define CRUTCH_H
#include "mainwindow.h" // Этот файл находится в том же подпроекте, что и crutch.h, именно в нём располагается класс TableMainWindow
#include <QObject>
class TableMainWindow;
class Crutch : public QObject
{
    Q_OBJECT
public:
    Crutch();
    ~Crutch();
    void showMainWindow();

private:

    TableMainWindow* mainWindow;
};
#endif // CRUTCH_H

crutch.cpp

#include "crutch.h"

Crutch::Crutch()
{
    mainWindow = new TableMainWindow;;
}

void Crutch::showMainWindow()
{
    mainWindow->show();
}

Crutch::~Crutch()
{
    delete mainWindow;
}

Как мне кажется, проблема заключается в строчке #include "subproject/crutch.h" но как исправить это не имею ни малейшего предположения.
P.S. в приведённом коде дважды встречается файл mainwindow, но это два разных файла. Просто один находится в подпроекте (он встречается в crutch.h), а второй в "шапке" проекта

MergeAllProjects.pro

TEMPLATE = subdirs
SUBDIRS = tablewindow
SUBDIRS += build
build.file = build.pro
SUBDIRS += cfg_browser_sh

build.pro

TEMPLATE = app
QT += widgets
SOURCES += main.cpp\
    mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui

Pro-файл первого (с ним происходит взаимодействие) подпроекта
tablewindow.pro

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = TableWindow
CONFIG += c++11
#TEMPLATE = app
TEMPLATE = lib
# каталог, в котором будет располагаться результирующий исполняемый файл
DESTDIR = $$OUT_PWD/bin

MOC_DIR = moc
OBJECTS_DIR = obj
RCC_DIR = rcc
UI_DIR = uic

DEFINES += QT_DEPRECATED_WARNINGS

include(cross/cross.pri)
include(table_window/table_window.pri)

INCLUDEPATH += $$PWD

SOURCES += \
    crutch.cpp \
    mainwindow.cpp

HEADERS += \
    crutch.h \
    mainwindow.h

FORMS += \
        mainwindow.ui

RESOURCES += \
    $$PWD/tablewindow.qrc

Так же имеется .pri файл, но он лишь содержит набор файлов, находящихся в этой же подпапке (headers, sources, forms)
Т.к. со вторым подпроектом взаимодействия нет (на данный момент), его .pro файлы решил не выкладывать (если необходимо, то и их предоставлю)


Здесь находятся все pro файлы проекта

  • 3
    показывай свои *.pro-файлы (или чем там собираешь?) и для затравки можешь почитать это: https://ru.stackoverflow.com/questions/536546/%d0%a1%d1%81%d1%8b%d0%bb%d0%ba%d0%b0-%d0%bd%d0%b0-%d0%bd%d0%b5%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d0%b2%d0%bd%d0%b5%d1%88%d0%bd%d0%b8%d0%b9-%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb-%d0%b2%d0%be%d0%b7%d0%bc%d0%be%d0%b6%d0%bd%d1%8b%d0%b5-%d0%bf%d1%80%d0%b8%d1%87%d0%b8%d0%bd%d1%8b/536547#536547 – Fat-Zer Dec 28 '18 at 03:54
  • Это проблема этапа линовки - вы либо не линкуете библиотеку, либо собрали ее неверно. Ну а чтобы это понять без файла сборки не обойтись. – Andrej Levkovitch Dec 28 '18 at 04:31
  • По моему файл сборки даже не открывали – AR Hovsepyan Dec 28 '18 at 06:10
  • @AndrejLevkovitch возможно не правильно вас понял насчёт библиотек, но свои я не создавал, лишь копировал папки с двумя проектами (подпроекты теперь) в новый (MergeAllProjects) и чуть-чуть изменил .pro файл последнего. – Recursive Daun Dec 28 '18 at 06:39
  • 1
    что-то я ни одного __declspec не вижу или какой-нибудь декларации экспорта. А как вы экспортируете класс из библиотеки? Посмотрите еще тут: https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application – Sublihim Dec 28 '18 at 10:39
  • @Sublihim Честно говоря, понятия не имею, о чём вы говорите. Похоже, что я не подготовился как следует по этой теме прежде чем задавать вопрос. Приношу извинения всем, кто потратил время на этот вопрос. Дальше я сам, благо информации появилось достаточно. – Recursive Daun Dec 28 '18 at 10:56
  • У вас лишняя ; после TableMainWindow; при объявлении указателя на mainWindow; – Alexander Chernin Dec 28 '18 at 11:10
  • @AlexanderChernin к сожалению, это роли не играет, компилятор спокойно пропускает подобные опечатки – Recursive Daun Dec 28 '18 at 12:49
  • @Sublihim вообще-то в вопросе ни слова не говорится о том, какая ОС используется. С чего вы решили, что это именно виндовс? – Andrej Levkovitch Dec 28 '18 at 14:44
  • @Sublihim вообще-то в вопросе ни слова не говорится о том, какая ОС используется. С чего вы решили, что это именно виндовс? – Andrej Levkovitch Dec 28 '18 at 14:45
  • Посоветую также воспользоваться утилитой nm и посмотреть нету ли в вашей библиотеке undefined reference. – Andrej Levkovitch Dec 28 '18 at 14:51
  • @RecursiveDaun, какая-то очень странная структура проекта... пока сложно угадать, чего именно ты хочешь и насколько сильно/что именно не правильно... из странностей я бы перечилил: использование mainwindow.* в двух разных файлах и отсутствие чего-либо линкуемого с новосозданной библиотекой; также вероятно ошибка проектирования: нужно определиться или костыль не знает о существовании окна, либо они вместе входят в библиотеку, либо ещё что-то... для определённости предлогаю уточнить полный состав дерева проекта, полный лог сборки (хотя бы с командой линковки приводящей к ошибке), а также ОС. – Fat-Zer Dec 30 '18 at 02:23
  • @AlexanderChernin прошу прощения, не на то обратил внимания. Эта опечатка попала при копировании кода (ума не приложу, как так произошло), в исходниках её нет. – Recursive Daun Dec 30 '18 at 13:05

0 Answers0