Вопрос по shared-libraries, portability, dynamic-loading, plugins, c++ – Какой самый простой способ написания переносимых динамически загружаемых библиотек на C ++?

6

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

Какой самый простой способ создать динамическую систему загрузки библиотек, которая может быть скомпилирована и запущена на нескольких операционных системах без дополнительной модификации кода? В идеале я хотел бы написать один плагин, и он будет работать на всех операционных системах, поддерживаемых проектом.

Благодарю.

Ваш Ответ

4   ответа
4

и он будет работать на всех операционных системах, поддерживаемых проектом.

Несколько вещей из головы:

Избегайте статических объектов в динамических библиотеках. Обеспечить правильные методы / функции инициализации для выделения объектов. Проблемы, возникающие при загрузке библиотеки ОС (это происходит при вызове c-cors для статических объектов), очень трудно отлаживать - только после проблем с многопоточностью.

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

Заголовки интерфейса могут не содержать сами классы реализации - только абстрактные классы изаводские функции, Аналогично предыдущему пункту - избегать применения зависит от конкретной версии классов. Фабрики необходимы как способ для пользовательского приложения для создания конкретных классов реализации.

При представлении новой версии интерфейса, для обеспечения обратной совместимости, не изменяйте существующий абстрактный класс - создайте новый абстрактный класс, унаследованный от него, и добавьте туда новые методы. Измените фабрику, чтобы вернуть новую версию. (Вспомните IInterface MS, IInterface2, IInterface3 и т. Д.) В реализации используйте более новую версию абстрактного класса. Это благодаря полиморфизму сделает реализацию обратно совместимой со старыми версиями интерфейса. (Это, очевидно, требует периодического обслуживания интерфейса и очистки - чтобы удалить старую грязь.)

5

Динамическая библиотека, загружающая Windows и Unix / Linux, работает с 3 функциями. Пара функций для загрузки / выгрузки библиотек и другая функция для получения адреса функции в библиотеке. Вы можете легко написать обертку вокруг этих трех функций, чтобы обеспечить поддержку кросс-операционных систем.

7

система загрузки, Загрузка DLL в Windows отличается от загрузкиобщий объект в Unix. Но с парой#ifdef в загрузчике у вас будет практически одинаковая кодовая база.

Сказав это, я думаю, вы можете сделать вашу платформу независимой. Конечно, вам придется скомпилировать его для каждой платформы, но код будет на 99% одинаковым.

2

на самом деле она не является частью boost, но вы можете найти ее в песочнице. Это также немного застыло, но в целом библиотека стабильна и проста в использовании.

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