Как ссылаться на приложение Qt?
Чтобы протестировать некоторые функции приложения Qt (названного qtapp), я собираю приложение Qt как библиотеку lib/dll. Ctor и dtor были правильно экспортированы в библиотеку. Однако при компиляции тестового проекта (проект консоли Qt с именем consoleTest) всегда выполняются следующие ошибки ссылки:
Ссылка: 1> Библиотека "C:\Users\gmbh\test\x64\Debug\consoleTest.lib" и объект C:\Users\gmbh\test\x64\Debug\consoleTest.exp" werden erstellt. 1>moc_testFour.obj: ошибка LNK2001: Nicht aufgelöstes externes Символ ""public: статическая структура QMetaObject const qtapp::staticMetaObject" (?staticMetaObject@qtapp@@2UQMetaObject@@B)". 1>testFour.objö: ошибка LNK2001: "Nicht extes"public: static struct QMetaObject const qtapp::staticMetaObject" (?staticMetaObject@qtapp@@2UQMetaObject@@B)". 1>C:\Users\gmbh\test\x64\Debug\consoleTest.exe: фатальная ошибка LNK1120: 1 nicht Aufgelöste Externe
Приложение Qt довольно просто:
#ifndef QTAPP_H
#define QTAPP_H
#include <QtWidgets/QMainWindow>
#include "ui_qtapp.h"
class __declspec(dllexport) qtapp : public QMainWindow
{
Q_OBJECT
public:
qtapp(QWidget* parent = 0);
~qtapp();
private:
Ui::qtappClass ui;
};
#endif // QTAPP_H
Реализация:
#include "qtapp.h"
__declspec(dllexport) qtapp::qtapp(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
__declspec(dllexport) qtapp::~qtapp()
{
}
Если я просто включу #include "qtapp.h"
в тестовом проекте компилятор выдает вышеуказанную ошибку.
Мои вопросы:
- Каковы причины ошибок?
- Как правильно развернуть приложение Qt как lib?
Мой компилятор Visual Studio 2013, версия qt 5.4.2
1 ответ
На самом деле это вопрос, независимый от Qt. При связывании приложения с библиотекой вам необходимо иметь __declspec(dllimport)
вместо __declspec(dllexport)
,
Чтобы достичь этого, обычно используется определение этого изменения при связывании библиотеки с привязкой приложения к библиотеке. У Microsoft есть страница справки на эту тему "Импорт в приложение с помощью __declspec (dllimport)".
Документация Qt предоставляет другую. Единственное, в чем может помочь Qt, это замена __declspec
кроссплатформенным Q_DECL_IMPORT.