2010-10-12 76 views
3

是否有人已成功將靜態編譯爲應用程序的QJson?我試圖在我的Qt應用程序(Windows/Mac)中靜態使用QJson,這意味着我試圖直接使用源文件而不是編譯DLL並使用它。這可能嗎?當我嘗試這樣做時,我的程序產生了很多錯誤,主要是「多重聲明」錯誤。他們似乎有這樣的方法結構:將QJson靜態編譯爲Qt應用程序(多個聲明錯誤)

SerializerRunnable::SerializerRunnable(QObject* parent) 
    : QObject(parent), 
     QRunnable(), 
     d(new Private) 
{ 
    qRegisterMetaType<QVariant>("QVariant"); 
} 
SerializerRunnable::~SerializerRunnable() 
{ 
    delete d; 
} 

任何想法,將不勝感激。

感謝,

+0

你是什麼意思的「方法結構」?我沒有看到任何異常。 – 2010-10-12 23:21:23

+0

我只是說這是如何在* .cpp文件中聲明的。對我來說也好(方法重載?),但似乎認爲事情正在被宣佈兩次。我不知道問題是什麼。 – jocull 2010-10-13 02:01:43

+0

我認爲我們需要查看其他上下文和錯誤才能提供幫助。 – 2010-10-13 15:48:34

回答

2

代碼已經編譯成DLL需要出口它要暴露到外面的世界,在運行時鏈接到它的函數和類。

在這種神奇的發生在qjson_export.h這種特殊情況下:

#ifndef QJSON_EXPORT_H 
#define QJSON_EXPORT_H 

#include <QtCore/qglobal.h> 

#ifndef QJSON_EXPORT 
# if defined(QJSON_MAKEDLL) 
    /* We are building this library */ 
# define QJSON_EXPORT Q_DECL_EXPORT 
# else 
    /* We are using this library */ 
# define QJSON_EXPORT Q_DECL_IMPORT 
# endif 
#endif 

#endif 

如果您沒有在您的.pro文件DEFINES += QJSON_MAKEDLL不那麼編譯器假定您使用一個 DLL,而不是編譯代碼,當被Q_DECL_EXPORT標記爲「其他地方定義的」的代碼實際上就在那裏,並且愚蠢地認爲它被定義了多次時,會感到困惑。

我希望這是有道理的。 :P

+0

啊,這工作!非常感謝你。我被QJSON_MAKEDLL搞糊塗了,並且認爲它會製作一個DLL而不是將源代碼編譯到我的結果可執行文件中。我很好奇爲什麼你只需要爲Windows定義QJSON_MAKEDLL?在基於Unix的系統上,它不是默認的共享庫嗎? – jocull 2010-10-20 13:38:26

+1

我無法與任何權威人士交談,但我猜想它與在Unix上構建共享庫時所有函數/類/等默認爲公共的事實有關。但是這並不能解釋爲什麼當在Unix環境中構建'.pro'文件時'Q_DECL_IMPORT'在沒有'QJSON_MAKEDLL'的情況下顯式聲明時顯示爲'工作'......也許其他人可以捨棄一些點亮這個。 – kurige 2010-10-21 18:57:52