如何参考Qt应用程序?

时间:2016-11-29 14:59:10

标签: qt unit-testing dll visual-studio-2013 linker-errors

为了测试Qt应用程序(名为qtapp)的一些功能,我将Qt应用程序构建为lib / dll库。 ctor和dtor已在库中正确导出。但是,编译测试项目(名为consoleTest的Qt控制台项目)始终会运行以下链接错误:

  

链接:   1 GT; Bibliothek“C:\ Users \ gmbh \ test \ x64 \ Debug \ consoleTest.lib”和Objekt C:\ Users \ gmbh \ test \ x64 \ Debug \ consoleTest.exp“werden erstellt。   1> moc_testFour.obj:错误LNK2001:Nichtaufgelöstesexternes符号“”public:static struct QMetaObject const qtapp :: staticMetaObject“(?staticMetaObject @ qtapp @@ 2UQMetaObject @@ B)”。   1> testFour.obj:错误LNK2001:Nichtaufgelöstesexternes符号“”public:static struct QMetaObject const qtapp :: staticMetaObject“(?staticMetaObject @ qtapp @@ 2UQMetaObject @@ B)”。   1> C:\ Users \ gmbh \ test \ x64 \ Debug \ consoleTest.exe:致命错误LNK1120:1nichtaufgelösteExterne

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 个答案:

答案 0 :(得分:1)

这实际上是一个独立于Qt的问题。将应用程序与库链接时,您需要__declspec(dllimport)而不是__declspec(dllexport)

要实现这一点,通常会使用在链接库与将应用程序链接到库时更改的定义。 Microsoft在"Importing into an Application Using __declspec(dllimport)"上有一个帮助页面。

Qt documentation提供另一个。 Qt可以提供帮助的一件事是用跨平台Q_DECL_IMPORT替换__declspec