Soname: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показаны 4 промежуточные версии 3 участников)
Строка 1: Строка 1:
[[Category:Devel]]
[[Category:Devel]]
{{Викифицировать}}
{{Stub}}
{{Stub}}
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/soname}}


=== Что делать, если библиотека в апстриме без soname? ===


<pre>
=== Создание библиотеки с soname ===
23.05.06, Yury Aliaev<mutab0r@rambler.ru> написал(а):
> У меня назрел следующий вопрос: имеется некая либа (назовём её, к
> примеру, libfoo, хотя это на самом деле
> [http://sourceforge.net/projects/liborigin) http://sourceforge.net/projects/liborigin)]. Сдалана она, что называется,
> на коленке: Makefile руками писан, libtool и близко не стоял...
> Соответственно, после компиляции получаем libfoo.so. И всё. Признаюсь,
> что info libtool я не читал, и не знаю, как всё на самом деле должно
> происходить, но обычно библиотека имеет обозначение типа
> libfoo.so.x.y.z, а на неё сделаны ссылки libfoo.so.x и libfoo.so. Причём
> сама либа пакуется в libfoo, а ссылки (вместе с заголовками для
> компиляции) -- в libfoo-devel.


Да, так и есть. Но это в том случае, если у библиотеки предусмотрен т.н. soname.
Правильная библиотека имеет название типа libfoo.so.x.y.z, а на неё сделаны ссылки libfoo.so.x и libfoo.so. Причём сама библиотека и ссылка libfoo.so.x пакуется в пакет libfoo, а libfoo.so, нужная обычно только для линковки, вместе с заголовками для компиляции пакуется в в libfoo-devel.
Если его нет, то необходимо апстриму протолкнуть патч, его включающий,
сэкономите кучу нервов на поддержке этой библиотеки, если она
когда-нибудь станет широко использоваться.


Обычно патч заключается в добавлении вот примерно такого в LDFLAGS при
Обычно версия библиотеки задаётся в LDFLAGS при линковке библиотеки примерно так:
линковке библиотеки
-Wl,-soname,libfoo.so.1
-Wl,-soname,libfoo.so.1


Строка 31: Строка 13:
Сам .so файл библиотеки при этом должен иметь имя типа libfoo.so.1.0.0
Сам .so файл библиотеки при этом должен иметь имя типа libfoo.so.1.0.0
или даже libfoo.so.1.0
или даже libfoo.so.1.0
Обратите внимание что первая цифра после .so совпадает с  цифрой после soname.
Обратите внимание, что первая цифра после .so совпадает с  цифрой после soname.


Таким образом, библиотека libfoo.so.1.0 имеет soname libfoo.so.1
Таким образом, библиотека libfoo.so.1.0 имеет soname libfoo.so.1
Строка 47: Строка 29:
сохранить работоспособность старых приложений.
сохранить работоспособность старых приложений.


> Я хочу узнать, как правильно поступить в моём случае: просто запаковать
=== Ссылки ===
> libfoo.so в пакет libfoo, а заголовки -- в libfoo-devel, или же самому
* Более подробно сказано здесь: [http://www.gnu.org/software/libtool/manual/libtool.html#Versioning http://www.gnu.org/software/libtool/manual/libtool.html#Versioning]
> переименовать libfoo.so в libfoo.so.x.y.z и засунуть в пакет libfoo (но
* [https://semver.org/lang/ru/ Семантическое версионирование]
> тогда из каких соображений взять x, y и z?) и создать ссылки libfoo.so.x
* [[API or ABI changing]]
> и libfoo.so, которые засунуть в пакет libfoo-devel?
 
Переименование бессмысленно по причинам, приведенным выше (soname).
Две библиотеки с одинаковым soname в одной системе не уживутся.
 
Более подробно сказано здесь:
[http://www.gnu.org/software/libtool/manual.html#Versioning http://www.gnu.org/software/libtool/manual.html#Versioning]
</pre>

Текущая версия от 20:29, 14 декабря 2017

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Создание библиотеки с soname

Правильная библиотека имеет название типа libfoo.so.x.y.z, а на неё сделаны ссылки libfoo.so.x и libfoo.so. Причём сама библиотека и ссылка libfoo.so.x пакуется в пакет libfoo, а libfoo.so, нужная обычно только для линковки, вместе с заголовками для компиляции пакуется в в libfoo-devel.

Обычно версия библиотеки задаётся в LDFLAGS при линковке библиотеки примерно так: -Wl,-soname,libfoo.so.1

Где libfoo.so.1 - это т.н. soname библиотеки. Сам .so файл библиотеки при этом должен иметь имя типа libfoo.so.1.0.0 или даже libfoo.so.1.0 Обратите внимание, что первая цифра после .so совпадает с цифрой после soname.

Таким образом, библиотека libfoo.so.1.0 имеет soname libfoo.so.1 Также надо создать ссылки libfoo.so.1 -> libfoo.so.1.0 и libfoo.so -> libfoo.so.1.0

Теперь о дальнейшем развитии библиотеки.

Если в новом релизе добавилась в библиотеку какая-то функциональность, не меняя старой (обратная совместимость по API), то надо прибавлять вторую или третью цифру.

А если изменения в новой библиотеке затронули старые API/ABI, то надо менять soname и первую цифру. Это позволит в переходный период сохранить работоспособность старых приложений.

Ссылки