C++ Qt插件:从qmake到qbs。联动误差

C++ 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 \ <...> <..

我有一个.pro项目,由两个产品组成:

player.pro

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,因为它可能控制库头文件中某个导出预处理器标记的值(我不能肯定,因为我不知道您的项目)。只需从导出项中删除此行