2016-11-29 34 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