Russian Qt Forum
Ноябрь 01, 2024, 09:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перенос Qt plugin-продукта из qmake в Qbs  (Прочитано 6360 раз)
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 нагенерил чего-то не то, но почему, и как это поправить, понять не выходит =_=
Может быть здесь найдётся кто-то, кто уже сталкивался с чем-то подобным?
« Последнее редактирование: Май 29, 2017, 13:18 от Dalidul » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Май 29, 2017, 12:51 »


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

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

Эти MediaPlayer { <...> } и ImagePlayer { <...> } где-то ранее определены как Custom Modules and Items? Иначе нужно использовать, например, DynamicLibrary:
MediaPlayer.qbs
Код:
DynamicLibrary {
    <...>
}

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

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

Пока сам не сделаешь...
fisenkdima
Гость
« Ответ #2 : Май 29, 2017, 13:18 »

Цитировать
Эти MediaPlayer { <...> } и ImagePlayer { <...> } где-то ранее определены как Custom Modules and Items? Иначе нужно использовать, например, DynamicLibrary:

Это заимпорченные через "import ... as ..." айтемы. И, да, я забыл их устранить, когда упрощал код в теме.
Сейчас поправлю, как должно быть.
Записан
fisenkdima
Гость
« Ответ #3 : Май 29, 2017, 13:20 »

И если есть дополнительные зависимости от модулей Qt, то их надо добавлять

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

Сообщений: 858



Просмотр профиля
« Ответ #4 : Май 29, 2017, 13:36 »

Возможно нужно внимательнее проследить за cpp.defines, какие определения там получаются для каждой библиотеки. В частности, должны ли они экспортироваться.
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Май 30, 2017, 19:22 »

Не вижу -DQT_PLUGIN или как-то так
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.