Задать вопрос

Система плагинов?

Здраствуйте. Разрабатываю проект, стараюсь сделать максимально модульным.

В связи с этим возник вопрос. Как лучше сделать поддержку плагинов?


У меня сейчас для этого есть базовый класс, который наследуют все плагины. Конкретный вопрос: как получить список сабклассов, от базового класса плагина. Именно такой подход я использовал в других языках (более высокого уровня, чем C++).


Возможно мой подход неверный, возможно плагин должен сам себя регистрировать. Тогда когда до него дойдет управление, если единственная точка входа — main.


Можно даже, на начальном этапе, рассмотреть не динамические плагины (в *.so), а вкомпилированные в сам бинарник. Набор плагинов будет конфигурироваться через ./configure при сборке проекта.


На C++ опыта не очень много. Вопрос кроссплатформенности интересует тоже.
  • Вопрос задан
  • 4515 просмотров
Подписаться 3 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
Mezomish
@Mezomish
1. Оформляете плагины в виде *.so, из которых наружу торчит одна-единственная функция: какая-нибудь «createPlugin()», которая создаёт и возвращает объект, унаследованный от вашего базового класса.
2. Сваливаете все плагины в один заранее известный каталог.
3. В основной программе проходите по всем файлам из этого каталога и грузите плагины функцией dlopen()
4. Имея хэндл либы получаете указатель на вашу функцию «createPlugin» при помощи функции dlsym()
5. Дёргаете функцию, получаете объект «плагин», сохраняете его куда-нибудь в список.
6. Проходитесь по списку и выбираете нужный по весу.
7. Выгружаете ненужные плагины.

Начать курить доку можно отсюда, а дальше — по ключевым словам.
Ответ написан
@megalol
Если C++-way (и C++-only), то через pimpl. Так делают в Qt, например.
То есть бинарно-совместимый класс, лежащий в хедере, устроенный так:
class Foo{ private: unique_ptr<FooImp> impl; public: void DoSomethig(); }; //И .cpp файл, в котором лежит struct FooImpl{ void ReallyDoSomethig(){doSomething;} }; void Foo::DoSomething(){ impl->ReallyDoSomethig(); } Foo::Foo() : impl(make_unique<FooImpl>()){ }
Чуть менее C++-way — интерфейс в .h файл,
Конкретный вопрос: как получить список сабклассов, от базового класса плагина.

С++ беден об информации о типах во время выполнения. Или руками (завести функцию getPluginSubclassesList() с вручную возвращаемым списком фабрик, ну или просто завести фабрику), или взять то, что эту информацию добавит. Возможно MOC из Qt умеет это.
Ответ написан
@NYM
Как раз для этого в своем проекте и писал Попытка написания своей компонентной модели на C++. Может сгодится…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы