2017-05-26 80 views
0

我有一个.pro项目包括两个产品:Qt插件:从qmake到qbs。链接错误

player.pro

TEMPLATE = subdirs 
SUBDIRS = mediaplayer \ 
      imageplayer 
imageplayer.depends = mediaplayer 

madiaplayer.pro - dll的LIB

TEMPLATE = lib 
DEFINES += MEDIAPLAYER_LIBRARY 
HEADERS = MediaPlayer_global.h \ <...> 
<...> 

imageplayer.pro - QT插件

TEMPLATE = lib 
CONFIG += plugin 
LIBS *= -L<path to mediaplayer dll> 
INCLUDEPATH *= mediaplayer \ <...> 
DEPENDPATH *= $$INCLUDEPATH 
<...> 

它工作正常。但现在我需要qbs版本。


我写的东西,如:

player.qbs

Project { 
    references: [ 
     "mediaplayer/MediaPlayer.qbs", 
     "imageplayer/ImagePlayer.qbs", 
    ] 
} 

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.qbs

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.h

#include "MediaPlayer_global.h" 
#include "MediaPlayerInterface.h" 

class MEDIAPLAYERSHARED_EXPORT MediaPlayer : public QWidget, public MediaPlayerInterface 
{ 
    Q_OBJECT 
    Q_INTERFACES(MediaPlayerInterface) 
    <...> 
} 

ImagePlayer.h

#include "../mediaplayer/MediaPlayer.h" 

class ImagePlayer : public MediaPlayer 
{ 
    Q_OBJECT 
    Q_INTERFACES(MediaPlayerInterface) 
    Q_PLUGIN_METADATA(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)

有没有人知道出了什么问题?

回答

0

这部分看起来很可疑:

Export { 
    // ... 
    cpp.defines: [ product.name.toUpperCase() + "_LIBRARY", ] 
} 

这是不可能的,你真的想导出这个定义,因为它可能控制在库的头文件中的一个部分出口预处理标记的值(我可以”不可否认,因为我不知道你的项目)。只需从“导出”项目中删除此行。