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

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

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

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


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


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


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


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

Начать курить доку можно отсюда, а дальше — по ключевым словам.
Ответ написан