如何使用另一个DLL为Qt制作第三方插件?

免责声明:一切工作正常在Linux上。 在Windows上,我最近从MinGW更改为MSVC2012,因为我无法正确读取MP3(请参阅使用MinGW编译WMF插件。 )

在我的项目中,我有:

  • 核心(DLL
  • 另一个使用Core构build的DLL
  • 媒体播放器(Qt应用程序,使用DLL和加载插件)

为了保持我的项目跨平台,我还提取了Windows特定function( 进度条,缩略图button )到第三方插件。 事实上,我开始编写一个插件pipe理器,它在运行时加载/卸载插件,无需重新启动应用程序,它工作正常。

但是,既然我已经切换到MSVC,我不能再build立我的插件。 我面对:

C4273:'staticMetaObject':不一致的dll链接

我不知道如何进行…我有以下结构:

在MainProject \ Core \ Interfaces中

class MIAMCORE_LIBRARY MediaPlayerPluginInterface : public BasicPluginInterface { public: virtual ~MediaPlayerPluginInterface() {} virtual void setMediaPlayer(QWeakPointer<MediaPlayer>) = 0; virtual bool providesView() const = 0; virtual void toggleViews(QWidget *) {} }; 

在Plugin.h中

 class Minimode : public QWidget, public MediaPlayerPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID MediaPlayerPluginInterface_iid) Q_INTERFACES(MediaPlayerPluginInterface) private: Ui::ConfigForm _ui; QWeakPointer<MediaPlayer> _mediaPlayer; bool _startMoving; QPoint _pos, _globalPos; public: explicit Minimode(); virtual ~Minimode(); inline virtual QString name() const { return "Minimode"; } inline virtual QString version() const { return "1.0"; } inline virtual bool providesView() const { return true; } virtual QWidget* configPage(); virtual void setMediaPlayer(QWeakPointer<MediaPlayer> mediaPlayer); virtual void toggleViews(QWidget *view); protected: /** Redefined to be able to drag this widget on screen. */ void mouseMoveEvent(QMouseEvent *e); /** Redefined to be able to drag this widget on screen. */ void mouseReleaseEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e); private: void applyColorToStandardIcon(QPushButton *button); }; 

我的Plugin.pro

 QT += widgets multimedia TARGET = $$qtLibraryTarget(mini-mode) TEMPLATE = lib MiamPlayerBuildDirectory = C:\dev\Miam-Player\build\MiamPlayer DEFINES += MINIMODE_MIAMPLUGIN CONFIG += c++11 CONFIG(debug, debug|release) { target.path = $$MiamPlayerBuildDirectory\debug\plugins LIBS += -Ldebug -lMiamCore } INSTALLS += target 

Miamcore_global.h

 #ifndef MIAMCORE_GLOBAL_H #define MIAMCORE_GLOBAL_H #include <QtCore/QtGlobal> #if defined(MIAMCORE_LIBRARY) #undef MIAMCORE_LIBRARY #define MIAMCORE_LIBRARY Q_DECL_EXPORT #else #define MIAMCORE_LIBRARY Q_DECL_IMPORT #endif #endif // MIAMCORE_GLOBAL_H 

我已经尝试了与macrosMIAMCORE_LIBRARY和另一个MINIMODE_PLUGIN各种排列但他们都没有工作(之间的类和Minimode但上面没有显示)。 我应该在我的* .pro文件中添加特定的关键字吗?

您的宏似乎是错误的出口和进口。

假如你不需要静态构建插件,这是一个有点真正的期望,因为这些都是动态库,你应该像下面一样使用你的宏。

另外请注意,你忘记了包含导入和导出宏定义的全局Qt头。

Miamcore_global.h

 #ifndef MIAMCORE_GLOBAL_H #define MIAMCORE_GLOBAL_H #include <QtCore/qglobal.h> #ifdef MINIMODE_MIAMPLUGIN # define MIAMCORE_LIBRARY Q_DECL_EXPORT #else # define MIAMCORE_LIBRARY Q_DECL_IMPORT #endif #endif // MIAMCORE_GLOBAL_H 

那么你将需要在你的项目文件中指定下面的定义:

YourPlugin.pro

 ... DEFINES += MINIMODE_MIAMPLUGIN ... 

这个设计在我们的Qt 4插件体系结构以及Windows和Unix上的Qt 5中工作正常。

进口的东西是Windows在这里。 在没有这个的情况下,在Linux上就可以,但是对于Windows,在构建它时需要确保导出插件,但是在实际使用时需要导入。

这就是为什么你需要传递所需的名称到项目文件这个编译时间,导出它。 一旦你的用户使用这个插件,这个定义将不再存在,然后它将被导入。