gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:32:05 30 4
gpt4 key购买 nike

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

“插件‘Z:/bug_pyqt/plugin.dll’使用了不兼容的 Qt 库。预期的构建 key ” Windows mingw 发布完整配置 ", 得到 " Windows mingw 调试完整配置 “”

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

它们是用 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() { }

文件生成文件:
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)

最佳答案

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

首先,错误消息中提到的“构建 key ”在文件 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)在主应用程序和插件之间是不同的。

关于qt - 应用程序和插件之间不兼容的 qt 库以相同方式编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16780797/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com