Хорошие шаблоны для системы на основе плагинов на 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.