2010-10-12 78 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