将QJson静态编译成Qt应用程序(多个声明错误)

问题描述 投票:0回答:1

有人成功地将QJson静态编译到应用程序中吗?我试图在我的 Qt 应用程序(Windows/Mac)中静态使用 QJson,这意味着我试图直接使用源文件,而不是编译 DLL 并使用它。这可能吗?当我尝试执行此操作时,我的程序会产生很多错误,其中大部分是“多重声明”错误。它们似乎与这样的方法结构有关:

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

任何想法将不胜感激。

谢谢,

c++ qt static-libraries
1个回答
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

如果您的

DEFINES += QJSON_MAKEDLL
文件中没有
.pro
,则编译器会假定您正在使用 DLL,而不是编译代码,并且当代码被
Q_DECL_EXPORT 标记为“在其他地方定义”时,编译器会感到困惑
事实上,就在那里,并且愚蠢地假设它被定义了多次。

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

© www.soinside.com 2019 - 2024. All rights reserved.