В Linux вам будет проще связываться с разделяемой библиотекой и использовать символические ссылки для исправления версии - IMO, это гораздо проще, чем использовать dlopen()
+ dlsym()
.
Таким образом, вы бы создали общие библиотеки для старых и новых версий вашей библиотеки:
g++ -shared -o libshared.so.1.1 -Wl,-soname=libshared.so.1 -L. -Wl,--whole-archive libstatic.a.old -Wl,-no-whole-archive
и
g++ -shared -o libshared.so.1.2 -Wl,-soname=libshared.so.1 -L. -Wl,--whole-archive libstatic.a.new -Wl,-no-whole-archive
Создание символических ссылок:
ln -s libshared.so.1.1 libshared.so.1
ln -s libshared.so.1 libshared.so
Создайте свое приложение, связав его со старой версией библиотеки. Я полагаю, что обе версии совместимы с двоичным кодом (ABI не сломан), но в новой версии могут быть новые символы
g++ -o myapp myapp.cpp -L. -lshared
Поскольку общая библиотека SONAME
равна libshared.so.1
, ваше приложение будет зависеть от нее и будет искать libshared.so.1
в путях из /etc/ld.so.conf
или LD_LIBRARY_PATH
Перед запуском приложения вы можете установить символическую ссылку libshared.so.1
, указав libshared.so.1.2
или libshared.so.1.1
.
Немного информации об опциях компоновщика, используемых здесь:
- весь-архив
Для каждого архива, упомянутого в командной строке после параметра --whole-archive, включите каждый объектный файл в архив в
ссылка, а не поиск в архиве нужных объектных файлов. Это обычно используется, чтобы превратить архивный файл в общий
библиотека, заставляя каждый объект быть включенным в результирующую общую библиотеку. Эта опция может быть использована более одного раза.
Два замечания при использовании этой опции от gcc: во-первых, gcc не знает об этой опции, поэтому вы должны использовать -Wl, -whole-archive.
Во-вторых, не забудьте использовать -Wl, -no-whole-archive после вашего списка архивов, потому что gcc добавит свой собственный список архивов в ваш список.
ссылку, и вы можете не захотеть, чтобы этот флаг также влиял на них.
-soname = имя
При создании общего объекта ELF установите для внутреннего поля DT_SONAME указанное имя. Когда исполняемый файл связан с
общий объект с полем DT_SONAME, тогда при запуске исполняемого файла динамический компоновщик попытается загрузить общий объект
определяется полем DT_SONAME, а не использованием имени файла, данного компоновщику.