Проверьте совместимость динамической библиотеки во время выполнения

Я занимаюсь разработкой приложения на C ++, которое требуется для загрузки динамической библиотеки во время выполнения с использованием dlopen. Эта библиотека, как правило, не будет написана мной.

Какой метод люди рекомендуют для обеспечения будущей двоичной совместимости между этой библиотекой и моим приложением?

Варианты, как я их вижу:

  1. Введите номер версии в имя файла библиотеки и попытайтесь загрузить его (через символическую ссылку), несмотря ни на что. Если dlopen не работает, сообщите об ошибке.

  2. Поддерживать второй интерфейс, который возвращает номер версии. Однако, если этот интерфейс изменяется по какой-либо причине, мы сталкиваемся с теми же проблемами, что и раньше.

Есть ли другие варианты?

1

Решение

Вы должны определить соглашение о динамически загружаемом (т.е. dlopen-ед) библиотека.

У вас может быть соглашение, что библиотека обязана предоставлять const char mylib_version_str[]; символ, который дает версию API и т. д. Конечно, у вас могут быть свои собственные приемы препроцессора, чтобы помочь в этом.

Для вашего вдохновения вы можете посмотреть, что GCC требует от своего плагины (например, plugin_is_GPL_compatible условное обозначение).

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

3

Другие решения

почему бы не использовать оба варианта? в действительности несколько библиотек уже делают это (например, Lua, старая dll — Lua51.dll, затем у вас есть Lua52 и т. д., и вы также можете запросить ее версию).

Хороший интерфейс может меняться, но не так часто, зачем два простых статических метода

const char* getLibraryName();
uint32 getLibraryVersion();

изменение с течением времени?

1

если вы / они используете libtool для сборки библиотеки / приложения, вы можете порекомендовать этот способ: http://www.gnu.org/software/libtool/manual/libtool.html#Versioning

1
По вопросам рекламы [email protected]