Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: fisenkdima от Май 29, 2017, 11:50



Название: Перенос Qt plugin-продукта из qmake в Qbs
Отправлено: fisenkdima от Май 29, 2017, 11:50
Мы тут надумали перевести свои проекты с qmake-а на Qbs, но возникала загвоздка с подпроектом, являющим собой qtplugin
В qmake-е это выглядит как-то так:

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 plugin
Код:
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
Код:
DynamicLibrary {
    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
Код:
DynamicLibrary {
    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: unresolved external symbol "public: static struct 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 нагенерил чего-то не то, но почему, и как это поправить, понять не выходит =_=
Может быть здесь найдётся кто-то, кто уже сталкивался с чем-то подобным?


Название: Re: Перенос Qt plugin-продукта из qmake в Qbs
Отправлено: ViTech от Май 29, 2017, 12:51

MediaPlayer.qbs
Код:
MediaPlayer {
    <...>
}

ImagePlayer.qbs
Код:
ImagePlayer {
    <...>
}

Эти MediaPlayer { <...> } и ImagePlayer { <...> } где-то ранее определены как Custom Modules and Items (http://doc.qt.io/qbs/custom-modules.html)? Иначе нужно использовать, например, DynamicLibrary (http://doc.qt.io/qbs/dynamiclibrary-item.html):
MediaPlayer.qbs
Код:
DynamicLibrary {
    <...>
}

ImagePlayer.qbs
Код:
DynamicLibrary {
    <...>
}

И если есть дополнительные зависимости от модулей Qt, то их надо добавлять:
Код:
Depends { name: "Qt"; submodules: [ "core", "widgets", "concurrent" ] }


Название: Re: Перенос Qt plugin-продукта из qmake в Qbs
Отправлено: fisenkdima от Май 29, 2017, 13:18
Цитировать
Эти MediaPlayer { <...> } и ImagePlayer { <...> } где-то ранее определены как Custom Modules and Items? Иначе нужно использовать, например, DynamicLibrary:

Это заимпорченные через "import ... as ..." айтемы. И, да, я забыл их устранить, когда упрощал код в теме.
Сейчас поправлю, как должно быть.


Название: Re: Перенос Qt plugin-продукта из qmake в Qbs
Отправлено: fisenkdima от Май 29, 2017, 13:20
И если есть дополнительные зависимости от модулей Qt, то их надо добавлять

Да, зависимости есть и они корректно прописаны. Я их вырезал отсюда как несущественную информацию, дабы не перегружать описание


Название: Re: Перенос Qt plugin-продукта из qmake в Qbs
Отправлено: ViTech от Май 29, 2017, 13:36
Возможно нужно внимательнее проследить за cpp.defines, какие определения там получаются для каждой библиотеки. В частности, должны ли они экспортироваться.


Название: Re: Перенос Qt plugin-продукта из qmake в Qbs
Отправлено: Авварон от Май 30, 2017, 19:22
Не вижу -DQT_PLUGIN или как-то так