Общая библиотека общей библиотеки GCC против символической ссылки

StackOverflow https://stackoverflow.com/questions/6339399

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть две библиотеки, например, две библиотеки тостеров 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$
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top