Хорошие шаблоны для системы на основе плагинов на C/С++?

При разработке платформы с плагинами C/С++ (= 2?) с общими объектами/динамическими библиотеками, которые должны поддерживать прямую замену, какие примеры будут полезны для просмотра деталей реализации?

Спасибо.

Примечание: прямая замена является ключевым моментом здесь, нет необходимости перезапускать систему - это требование

Ответ 1

Если вы находитесь на POSIX, dlopen(), dlsym() и dlclose() - все, что вам нужно.

Подробнее см. man dlsym.

Существует хорошая статья о загрузке динамических библиотек, а в качестве примера используется инфраструктура плагинов.

EDIT OP добавила Windows как требование, поэтому этот подход не поможет, поскольку Windows не совместима с POSIX. Однако в WinAPI есть аналогичные функции - см. здесь.

Ответ 2

Возможно, вы захотите попробовать Boost.Extension, но будьте осторожны: несмотря на свое имя, это не одна из библиотек boost.

Ниже приведена ссылка на ее документацию.

Ответ 3

Если вы хотите, чтобы загрузка межплатформенной библиотеки не разрабатывалась для каждого API платформы отдельно, libltdl может помочь.

Libtool предоставляет небольшую библиотеку под названием libltdl, которая направлена ​​на скрыть различные трудности, связанные с расширением библиотек от программистов. Он состоит из нескольких заголовков и небольших исходных файлов C, которые могут быть распространены с приложениями, требующими функциональности расширения. На некоторых платформах, чьи динамические компоновщики слишком ограничены для простой реализации служб libltdl, для этого требуется GNU DLD, или она будет только эмулировать динамическое связывание с механизмом libtool dlpreopening.

libltdl поддерживает в настоящее время следующие динамические механизмы связывания:

  • dlopen (Solaris, Linux и различные варианты BSD)
  • shl_load (HP-UX)
  • LoadLibrary (Win16 и Win32)
  • load_add_on (BeOS)
  • NSAddImage или NSLinkModule (Дарвин и Mac OS X)
  • GNU DLD (эмулирует динамическое связывание для статических библиотек)
  • libtool dlpreopen (см. Dlpreopening)

Boost.Extension, похоже, поддерживает только файлы Windows PE dll s, UNIX ELF и пакеты Mac OS X Mach-O. Ну, этого может быть достаточно для вас...

Ответ 4

Для плагинов С++ вы можете проверить эту статью, в которой подробно описывается, как достичь этого с помощью упомянутых ранее вызовов posix.

Цитата:

Учитывая, что мы можем использовать эти функции для доступа к функциям в библиотеке C, как мы используем их для доступа к классам в библиотеке С++? Есть несколько проблем для преодоления. Во-первых, мы должны иметь возможность находить символы, которые нам нужны в библиотеке. Это сложнее, чем может показаться из-за различия между тем, как символы хранятся в файлах C и С++.

Ответ 5

Boost.Extension кажется приятным (никогда не использовал его, но попытался в ближайшее время). Другой альтернативой может быть класс POCO SharedLibrary.