Шаблон поддиров в Qt

Я пытаюсь создать структуру проекта, как показано ниже

test/
test.pro
build/
  build.pro
  main.cpp
gui/
  gui.pro
  mainwindow.h
  mainwindow.cpp

Мой test.pro выглядит следующим образом:

TEMPLATE = subdirs
SUBDIRS = gui
CONFIG += ordered
SUBDIRS +=build

build.pro

TEMPLATE = app
QT += core gui
SOURCES += main.cpp
LIBS += -L../gui

gui.pro

TEMPLATE  = lib

SOURCES += \
   mainwindow.cpp

HEADERS  += \
   mainwindow.h

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(){}

MainWindow::~MainWindow(){}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
   public:
     MainWindow();
     ~MainWindow();
 };

 #endif // MAINWINDOW_H

main.cpp

#include <QApplication>
#include "gui/mainwindow.h" //error

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
    return a.exec();
}

У меня возникла ошибка во время компиляции:

../../test/build/main.cpp:2:25: error: gui/gui.h: No such file or directory

Что я делаю неправильно?


Спасибо, Бруно. Я изменил строку:

#include "gui/mainwindow.h"

к

#include "../gui/mainwindow.h"

Но теперь у меня есть ошибка, как показано ниже:

undefined reference to `MainWindow::MainWindow()' 
undefined reference to `MainWindow::~MainWindow()'

Файл mainwindow.cpp выглядит следующим образом:

#include "mainwindow.h"

MainWindow::MainWindow()
{}

MainWindow::~MainWindow()
{}

Как добавить файл mainwindow.h в mainwindow.cpp??

+2
источник поделиться
4 ответа

Когда я изменил файл build.pro на:

TEMPLATE = app
QT += core gui

SOURCES += main.cpp

LIBS += -L../gui/debug -lgui

приложение вышло с кодом -1073741515.

Может быть, путь в разделе libs неверен?

Ниже дерева файлов, сгенерированных qt:

test/
  test.pro
  build/
    build.pro
    main.cpp
  gui/
    gui.pro
    mainwindow.h
    mainwindow.cpp

test-build-desktop/
  Makefile
  build/
    debug/
    release/
    Makefile
    Makefile.Debug
    Makefile.Release
  gui/
    debug/
      gui.dll
      libgui.a
      mainwindow.o
    release/
    Makefile
    Makefile.Debug
    Makefile.Release

Я проверил exe файл Dependency Walker: ССЫЛКА на изображение

+2
источник
test/
test.pro
build/
  build.pro
  main.cpp
gui/
  gui.pro
  mainwindow.h
  mainwindow.cpp

В каталоге gui нет файла с именем gui.h - причиной ошибки.

ИЗМЕНИТЬ

Может быть, вы хотели gui/mainwindow.h включить?

0
источник

error: gui/gui.h: Нет такого файла или каталога

Это потому, что в этом каталоге нет такого файла.:)

В этом каталоге есть только 3 файла gui.pro mainwindow.h и mainwindow.cpp.

Я думаю, вы хотели включить "gui/mainwindow.h", правильно?

0
источник

Я не знаю, что я делаю неправильно? Когда я прокомментирую #include "gui/mainwindow.h", тогда все OK.

Я думаю, проблема в вашей директиве include. Попробуйте изменить его на

#include "../gui/mainwindow.h"

Когда препроцессор находит #include, он заменяет его всем содержимым указанного файл. Существует два способа указать файл для включения:

#include "file" #include <file>

Единственное различие между обоими выражения - это места (каталоги), где компилятор ищем файл. в первый случай, когда имя файла между двумя кавычками, файл сначала просматривается в том же каталог, содержащий файл содержащий директиву. В случае, если его нет, поиск компилятора файл в каталогах по умолчанию где он настроен для поиска стандартные файлы заголовков. Если файл имя заключено между угловые скобки < > поиск файла прямо где компилятор настроен на поиск стандарта файлы заголовков. Поэтому стандартная файлы заголовков обычно включаются в угловые скобки, тогда как другие специфические заголовочные файлы включаются с использованием котировки.

http://msdn.microsoft.com/en-us/library/36k2cdd4%28VS.80%29.aspx

Отредактировано:

Теперь для undefined эталонной ошибки. Вам нужно изменить файл build.pro.

Изменить:

LIBS += -L../gui 

к чему-то вроде

LIBS += -L../gui/debug -lgui

(путь../gui/debug работает для меня, потому что именно там находится lib "gui" )

Идея состоит в том, что вам нужно отделить каталог, в котором находится библиотека, от имени библиотеки (без расширения и без префикса lib).

Смотрите этот вопрос здесь: Добавление внешней библиотеки в проект Qt Creator

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос