简体   繁体   English

Qt插件:从qmake到qbs。 链接错误

[英]Qt plugin: From qmake to qbs. Linkage error

I have a .pro project consisting of two products: 我有一个由两个产品组成的.pro项目:

player.pro player.pro

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

madiaplayer.pro - dll lib madiaplayer.pro-DLL库

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

imageplayer.pro - qt plugin imageplayer.pro-Qt插件

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

It works fine. 工作正常。 But now I need qbs version. 但是现在我需要qbs版本。


I write something like: 我写类似:

player.qbs player.qbs

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

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

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

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

ImagePlayer.h ImagePlayer.h

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

class ImagePlayer : public MediaPlayer
{
    Q_OBJECT
    Q_INTERFACES(MediaPlayerInterface)
    Q_PLUGIN_METADATA(IID "org.geeksoft.qt.MediaPlayerInterface")
    <...>
}

But... I got a very unclear error result (it's ImagePlayer.dll linkage stage): 但是...我得到了一个非常不清楚的错误结果(它是ImagePlayer.dll链接阶段):

ImagePlayer.cpp.obj: unresolved external symbol "public: static struct QMetaObject const MediaPlayer::staticMetaObject" (?staticMetaObject@MediaPlayer@@2UQMetaObject@@B) ImagePlayer.cpp.obj:无法解析的外部符号“ public:静态结构QMetaObject const MediaPlayer :: staticMetaObject”(?staticMetaObject @ MediaPlayer @@ 2UQMetaObject @@ B)

moc_ImagePlayer.cpp.obj: unresolved external symbol "public: static struct QMetaObject const MediaPlayer::staticMetaObject" (?staticMetaObject@MediaPlayer@@2UQMetaObject@@B) moc_ImagePlayer.cpp.obj:未解析的外部符号“ public:静态结构QMetaObject const MediaPlayer :: staticMetaObject”(?staticMetaObject @ MediaPlayer @@ 2UQMetaObject @@ B)

Does anybody know what have gone wrong? 有人知道哪里出了问题吗?

This part looks suspicious: 这部分看起来可疑:

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

It is unlikely that you really want to export this define, as it probably controls the value of some EXPORT preprocessor token in one of the library's header files (I can't say for sure, because I don't know your project). 您不太可能真的要导出此定义,因为它可能控制库的头文件之一中某些EXPORT预处理器令牌的值(我不确定,因为我不了解您的项目)。 Just remove this line from the Export item. 只需从“导出”项中删除此行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM