Есть следующий проект в Qbs
import qbs
import "../StandartApp.qbs" as StandartApp
import "../StandartLib.qbs" as StandartLib
Project {
StandartApp {
name: "GUI"
path: name + "/"
Depends { name: "Qt"; submodules: ["core", "gui", "widgets"] }
Depends { name: "SessionModule" }
}
StandartLib {
name: "SessionModule"
path: name + "/"
Depends { name: "Qt"; submodules: ["core", "gui", "widgets"] }
}
}
Здесь StandartApp определён так:
import qbs
import "StandartLib.qbs" as StandartLib
StandartLib {
type: "application"
Group {
fileTagsFilter: product.type
qbs.install: true
}
}
А StandartLib так:
import qbs
CppApplication {
type: "library"
property string path : ""
FileTagger {
patterns: "*.cpp"
fileTags: "cpp"
}
files: [path + '*.h', path + '*.cpp', path + '*.ui']
Depends { name: "cpp" }
cpp.cppFlags: "-std=c++11"
//cpp.defines: ['__cplusplus 201103L']
}
Т.е. имеется приложение и либа.
Исходники расположены следующим образом:
./Game.qbs
./../StandartLib.qbs
./../StandartApp.qbs
./GUI/MainWindow.ui
./GUI/MainWindow.h
./GUI/MainWindow.cpp
./SessionModule/GameSession.h
./SessionModule/GameSession.cpp
Проблема состоит в следующем. На момент начала линковки приложения, в папке сборки есть единственный объектный файл MainWindow.cpp.o (это единственный класс приложения).
В то время как на деле там также должен находится ещё и файл GameSession.cpp.o (единственный класс либы), который используется в MainWindow.
Иными словами, либа не компилится. Очевидно, не распознается зависимость приложения от неё. В результате я получаю ошибки следующего характера:
undefined reference to `GameSession::interrupt()'
при попытке обратиться к методам класса из либы.
Что я сделал не так? (код ниже)
Приложение содержит окно MainWindow (наследник QMainWindow), которое является стартовым.
Код его .h-файла:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWidget>
namespace Ui {
class MainWindow;
}
class GameSession;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void startNewGame();
private:
Ui::MainWindow *_ui;
GameSession *_gameSession;
};
#endif // MAINWINDOW_H
Код .cpp-файла:
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "../SessionModule/GameSession.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, _ui(new Ui::MainWindow)
, _gameSession(nullptr)
{
_ui->setupUi(this);
connect(_ui->actionStart_new_game, SIGNAL(triggered()),
this, SLOT());
}
MainWindow::~MainWindow()
{
delete _ui;
}
void MainWindow::startNewGame()
{
if (_gameSession) {
_gameSession->interrupt();
delete _gameSession;
_gameSession = nullptr;
}
_gameSession = new GameSession();
QWidget *gameSessionWidget = _gameSession->start();
}
Либа содержит класс GameSession
Его .h-файл:
#ifndef GAMESESSION_H
#define GAMESESSION_H
class QWidget;
class GameSession
{
public:
GameSession();
~GameSession();
QWidget* start();
void interrupt();
};
#endif // GAMESESSION_H
Его .cpp-файл:
#include "GameSession.h"
#include <QWidget>
GameSession::GameSession()
{}
GameSession::~GameSession()
{}
QWidget* GameSession::start()
{
return new QWidget();
}
void GameSession::interrupt()
{}