2016-11-29 33 views
0

为了测试Qt应用程序(名为qtapp)的某些功能,我将Qt应用程序构建为lib/dll库。 ctor和dtor已经正确导出到库中。然而编译测试项目(名为consoleTest Qt的控制台项目)一直运行到以下链接错误:如何引用Qt应用程序?

链接: 1> Bibliothek“C:\用户\有限公司\测试\ 64 \调试\ consoleTest。 lib“和Objekt C:\ Users \ gmbh \ test \ x64 \ Debug \ consoleTest.exp”werden erstellt。 1> moc_testFour.obj:error LNK2001:Nichtaufgelöstesexternes符号“”public:static struct QMetaObject const qtapp :: staticMetaObject “?staticMetaObject @quata @@ 2UQMetaObject”(?staticMetaObject @ qtapp @@ 2UQMetaObject @@ B)“ 1> testFour.obj:error LNK2001:Nichtaufgelöstesexternes Symbol”“public:static struct QMetaObject const qtapp :: staticMetaObject”(?staticMetaObject @ qtapp @@ 2UQMetaObject @@ B)“。 1> C:\ Users \ gmbh \ test \ x64 \ Debug \ consoleTest.exe:致命错误LN K1120:1个nichtaufgelö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",编译器产生上述错误。

我的问题:

  • 什么是错误的原因是什么?
  • 如何在lib中正确部署Qt 应用程序?

我的编译器的Visual Studio 2013,Qt拥有的5.4.2

回答

1

的版本实际上是独立的Qt的问题。在将应用程序链接到库时,您需要有__declspec(dllimport)而不是__declspec(dllexport)

为了达到这个目的,通常使用链接库时链接应用程序和库时定义的变化。微软在"Importing into an Application Using __declspec(dllimport)"上有一个帮助页面。

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

+0

我想,你不明白我的目的。上面的qtapp实际上是一个虚拟项目。我的最终目标是在我的qt应用程序中测试一些函数。以这样的速度,Qt应用程序应该首先导出**到一个dll中,后来在我的测试项目中将被导入**,并且所需的dll函数将被调用和验证。 – euroswenwickler

+0

用你的例子代码,当你在你的测试项目中包含'qtapp.h'时,它会看到一个错误的'__declspec(dllexport)'而不是'__declspec(dllimport)'。没有一个更完整的例子,我不知道还有什么可能是错的;) – E4z9