Как ссылаться на приложение 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.

Другие вопросы по тегам