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

Материал из ALT Linux Wiki
(Import from freesource.info)
 
Нет описания правки
 
(не показано 5 промежуточных версий 4 участников)
Строка 1: Строка 1:
[[Category:Devel]]
[[Category:Devel]]
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/soname}}
{{Stub}}


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


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


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


Да, так и есть. Но это в том случае, если у библиотеки предусмотрен т.н. soname.
Обычно версия библиотеки задаётся в LDFLAGS при линковке библиотеки примерно так:
Если его нет, то необходимо апстриму протолкнуть патч, его включающий,
сэкономите кучу нервов на поддержке этой библиотеки, если она
когда-нибудь станет широко использоваться.
 
Обычно патч заключается в добавлении вот примерно такого в LDFLAGS при
линковке библиотеки
-Wl,-soname,libfoo.so.1
-Wl,-soname,libfoo.so.1


Строка 19: Строка 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
Строка 35: Строка 29:
сохранить работоспособность старых приложений.
сохранить работоспособность старых приложений.


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

Текущая версия от 17: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 и первую цифру. Это позволит в переходный период сохранить работоспособность старых приложений.

Ссылки