Общая библиотека общей библиотеки GCC против символической ссылки
Вопрос
У меня есть две библиотеки, например, две библиотеки тостеров libtoaster_a.so а также libtoaster_b.so и все связанные сосуды Major/Minor/Rev libtoaster_a.so.1.0.0 и т. д. Обе библиотеки реализуют одинаковый интерфейс тостера, но просто выполняют обработку по -разному. Следовательно, когда я строю приложение, которое использует библиотеку, не имеет значения, что используется (с точки зрения приложений они одинаковы).
Потому что я хотел бы решить, какую библиотеку использовать после составления и распределения приложения я делаю символическую ссылку libtoaster.so который указывает на libtoaster.so.1 что может указывать на любого libtoaster_a.so.1 а также libtoaster_b.so.1. Анкет Следовательно, пользователь/установщик мог просто изменить libtoaster.so.1 Ссылка на выбор реализации для использования.
Для сборки скажем, что у меня есть libtoaster.so.1 Связано с libtoaster_a.so.1 по умолчанию. Когда я составляю свое приложение, например: my_app чем -то вроде gcc -o my_app -ltoaster...
он собирает и даже работает с libtoaster_a.so.1 правильно. Однако, если я запускаю LDD на my_app, я увижу, что он связан с libtoaster_a.so.1 скорее, чем libtoaster.so.1 По желанию, следовательно, изменив libtoaster.so.1 Ссылка не имеет никакого эффекта.
Есть ли более приятный способ исправить это, чем сделать libtoaster_a.so.1, переименование в libtoaster.so.1, создавая my_app против этой библиотеки, затем удаляет libtoaster.so.1 И снова создать его как символическую ссылку?
Решение
Когда вы строите общие библиотеки, добавьте "-wl, -soname = libtoaster.so.1" к флагам GCC (при условии, что вы связываете с GCC). Это устанавливает DT_SONAME в библиотеке и заставит любое приложение, связанное с этой библиотекой, снять имя библиотеки из DT_SONAME, а не с имени файла.
[vps@manticore]~/cprog/toaster1$ gcc -c my_app.c
[vps@manticore]~/cprog/toaster1$ gcc -c toaster.c
[vps@manticore]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o
[vps@manticore]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
my_app: can't load library 'libtoaster.so'
my_app: exit status 4
[vps@manticore]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
Start End Type Open Ref GrpRef Name
1c000000 3c004000 exe 1 0 0 my_app
05b1f000 25b23000 rlib 0 1 0 /home/vps/cprog/toaster1/libtoaster.so
084f9000 28532000 rlib 0 1 0 /usr/lib/libc.so.51.0
09e80000 09e80000 rtld 0 1 0 /usr/libexec/ld.so
[vps@manticore]~/cprog/toaster1$