应用程序和插件之间不兼容的qt库编译方式相同

时间:2013-05-27 21:31:42

标签: qt plugins dll mingw

在使用相同的标志编译Qt应用程序和Qt插件之后(除了为编译.dll添加了-shared之外),执行时出现错误消息:

“插件'Z:/bug_pyqt/plugin.dll'使用不兼容的Qt库。预期的构建密钥” Windows mingw release full-config “,得到” Windows mingw debug full-配置 “”

如果主应用程序和插件都使用相同的标志进行编译,为什么会出现此错误消息?

他们使用mingw32-g ++在Windows XP下的cygwin下用手工制作的makefile编译。 使用选项“-g”编译主应用程序(并且插件仍然没有)使事情“正常”并且错误消息消失但理由是什么?

将main.cpp文件编译成a.out:

#include <QCoreApplication>
#include <QPluginLoader>
#include <QDebug>

int main(int argc, char **argv)
{
        QCoreApplication app(argc, argv);

        QPluginLoader loader("plugin.dll");
        loader.setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint);
        loader.load();
        if(!loader.isLoaded()) {
                qDebug() << loader.errorString();
                exit(1);
        }
        (void)loader.instance();

        return app.exec();
}

文件plugin.h:

#ifndef PLUGIN_H
#define PLUGIN_H

#include <QObject>

class Plugin : public QObject
{
        Q_OBJECT
public:
        Plugin();
        ~Plugin();

};

#endif

将plugin.cpp文件编译成plugin.dll:

#include "plugin.h"

#include <QtPlugin>

Q_EXPORT_PLUGIN2(Plugin, Plugin)

Plugin::Plugin() { }

Plugin::~Plugin() { }

文件Makefile:

MOC=/cygdrive/c/Qt/4.8.4/bin/moc
GCC=/cygdrive/c/MinGW/bin/mingw32-g++.exe
FLAGS=-Ic:/Qt/4.8.4/include -Ic:/Qt/4.8.4/include/QtCore -Lc:/Qt/4.8.4/lib -Lc:/Qt/4.8.4/bin -lQtCore4
LIBFLAGS=-shared

all:
        $(MOC) plugin.h > plugin_moc.cpp
        $(GCC) -o a.out main.cpp $(FLAGS)
        $(GCC) -o plugin.dll $(LIBFLAGS) plugin_moc.cpp plugin.cpp $(FLAGS)

1 个答案:

答案 0 :(得分:3)

经过调查,这里有一半答案

首先,在文件QtCore / qconfig.h中定义为宏QT_BUILD_KEY的错误消息中提到的“构建密钥”。

以下是此文件的相关摘录:

#if defined(__SYMBIAN32__)
# define QT_BUILD_KEY "Symbian full-config"
#else
# if !defined(QT_NO_DEBUG)
#  if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
#   define QT_BUILD_KEY "Windows x64 mingw debug full-config"
#  else
#   define QT_BUILD_KEY "Windows mingw debug full-config"
#  endif
# else
#  if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
#   define QT_BUILD_KEY "Windows x64 mingw release full-config"
#  else
#   define QT_BUILD_KEY "Windows mingw release full-config"
#  endif
# endif
#endif

据此我们了解到,我们可以通过定义宏QT_NO_DEBUG来强制插件的构建类型“释放”。

在插件的编译命令中添加“-DQT_NO_DEBUG”解决了这个问题。

这仍然无法解释为什么默认情况下Qt_BUILD_KEY(或QT_NO_DEBUG)在主应用和插件之间有所不同。