gcc ссылка общая библиотека на символическую ссылку - PullRequest
8 голосов
/ 14 июня 2011

У меня есть две библиотеки, например, две библиотеки тостеров libtoaster_a.so и libtoaster_b.so и все связанные основные / второстепенные / 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 и снова создать его как символическую ссылку?

1 Ответ

6 голосов
/ 14 июня 2011

Когда вы создаете общие библиотеки, добавьте «-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$
...