C++ Qt插件:从qmake到qbs。联动误差
我有一个.pro项目,由两个产品组成: player.proC++ Qt插件:从qmake到qbs。联动误差,c++,qt,qbs,qtplugin,C++,Qt,Qbs,Qtplugin,我有一个.pro项目,由两个产品组成: player.pro TEMPLATE = subdirs SUBDIRS = mediaplayer \ imageplayer imageplayer.depends = mediaplayer madiaplayer.pro-dll库 TEMPLATE = lib DEFINES += MEDIAPLAYER_LIBRARY HEADERS = MediaPlayer_global.h \ <...> <..
TEMPLATE = subdirs
SUBDIRS = mediaplayer \
imageplayer
imageplayer.depends = mediaplayer
madiaplayer.pro-dll库
TEMPLATE = lib
DEFINES += MEDIAPLAYER_LIBRARY
HEADERS = MediaPlayer_global.h \ <...>
<...>
MediaPlayer.qbs
MediaPlayer {
Group {
qbs.install: true
fileTagsFilter: "dynamiclibrary"
}
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
Export {
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
}
<...>
}
ImagePlayer {
Depends { name: "MediaPlayer" }
Export { Depends { name: "MediaPlayer" } }
Group {
qbs.install: true
fileTagsFilter: "dynamiclibrary"
}
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
Export {
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
}
<...>
}
MediaPlayer{
团体{
qbs.install:true
fileTagsFilter:“dynamiclibrary”
}
cpp.includePath:product.sourceDirectory
cpp.defines:[product.name.toUpperCase()+“_库”,]
出口{
cpp.includePath:product.sourceDirectory
cpp.defines:[product.name.toUpperCase()+“_库”,]
}
}
ImagePlayer.qbs
MediaPlayer {
Group {
qbs.install: true
fileTagsFilter: "dynamiclibrary"
}
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
Export {
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
}
<...>
}
ImagePlayer {
Depends { name: "MediaPlayer" }
Export { Depends { name: "MediaPlayer" } }
Group {
qbs.install: true
fileTagsFilter: "dynamiclibrary"
}
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
Export {
cpp.includePaths: product.sourceDirectory
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
}
<...>
}
ImagePlayer{
取决于{name:“MediaPlayer”}
导出{name:“MediaPlayer”}
团体{
qbs.install:true
fileTagsFilter:“dynamiclibrary”
}
cpp.includePath:product.sourceDirectory
cpp.defines:[product.name.toUpperCase()+“_库”,]
出口{
cpp.includePath:product.sourceDirectory
cpp.defines:[product.name.toUpperCase()+“_库”,]
}
}
MediaPlayer.h
#include "MediaPlayer_global.h"
#include "MediaPlayerInterface.h"
class MEDIAPLAYERSHARED_EXPORT MediaPlayer : public QWidget, public MediaPlayerInterface
{
Q_OBJECT
Q_INTERFACES(MediaPlayerInterface)
<...>
}
#包括“MediaPlayer_global.h”
#包括“MediaPlayerInterface.h”
类MEDIAPLAYERSHARED_导出MediaPlayer:public QWidget,public MediaPlayerInterface
{
Q_对象
Q_接口(MediaPlayerInterface)
}
ImagePlayer.h
#include "../mediaplayer/MediaPlayer.h"
class ImagePlayer : public MediaPlayer
{
Q_OBJECT
Q_INTERFACES(MediaPlayerInterface)
Q_PLUGIN_METADATA(IID "org.geeksoft.qt.MediaPlayerInterface")
<...>
}
#包括“./mediaplayer/mediaplayer.h”
类ImagePlayer:公共媒体播放器
{
Q_对象
Q_接口(MediaPlayerInterface)
Q_插件_元数据(IID“org.geeksoft.qt.MediaPlayerInterface”)
}
但是。。。我得到了一个非常不清楚的错误结果(它是ImagePlayer.dll链接阶段):
ImagePlayer.cpp.obj:未解析的外部符号“public:static struct QMetaObject const MediaPlayer::staticMetaObject”(?staticMetaObject@MediaPlayer@@2UQMetaObject@@B)
moc_ImagePlayer.cpp.obj:未解析的外部符号“public:static struct QMetaObject const MediaPlayer::staticMetaObject”(?staticMetaObject@MediaPlayer@@2UQMetaObject@@B)
有人知道出了什么问题吗?这部分看起来可疑:
Export {
// ...
cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ]
}
您不太可能真的想要导出这个define,因为它可能控制库头文件中某个导出预处理器标记的值(我不能肯定,因为我不知道您的项目)。只需从导出项中删除此行