Соглашения об именах библиотек
Согласно Уилеру , у нас есть real name
, soname
и linker name
:
Real name libfoo.so.1.2.3
Soname libfoo.so.1
Linker name libfoo.so
real name
- это имя файла, содержащего фактический код библиотеки. soname
обычно является символической ссылкой на real name
, и его номер увеличивается, когда интерфейс изменяется несовместимым образом. Наконец, linker name
- это то, что компоновщик использует при запросе библиотеки, которая является сонамой без номера версии.
Итак, чтобы ответить на ваш последний вопрос первым, вы должны использовать soname
, libhelloworld.so.1
, для опции компоновщика при создании общей библиотеки :
g++ ... -Wl,-soname,libhelloworld.so.1 ...
В этом документе Kerrisk предоставляет очень краткий пример того, как создать общую библиотеку, используя стандартные соглашения об именах. Я думаю, что Kerrisk и Wheeler стоит прочитать, если вы хотите узнать больше о библиотеках Linux.
Соглашения о нумерации библиотек
Существует некоторая путаница относительно намерения и цели каждого из чисел в real name
библиотеки. Я лично считаю, что Apache Portable Runtime Project хорошо объясняет правила, когда следует увеличивать каждое число.
Короче говоря, номера версий можно рассматривать как libfoo.MAJOR.MINOR.PATCH
.
PATCH
увеличивается для изменений, которые являются прямой и обратной совместимостью с другими версиями.
MINOR
следует увеличивать, если новая версия библиотеки является исходной и двоичной, совместимой со старой версией. Различные второстепенные версии обратно совместимы, но необязательно совместимы друг с другом.
MAJOR
увеличивается, когда вводится изменение, которое нарушает API или иным образом несовместимо с предыдущей версией.
Это означает, что PATCH
релизы могут отличаться только внутренне, например, способом реализации функции. Изменение API, подписи открытых функций или интерпретации параметров функции: не разрешено .
Новая версия MINOR
может вводить новые функции или константы и не использовать существующие функции, но может не удалять ничего, что подвергается внешнему воздействию. Это обеспечивает обратную совместимость . Другими словами, младший выпуск 1.12.3
может использоваться для замены любой другой 1.12.x
или более ранней версии, такой как 1.11.2
или 1.5.0
. Это не является заменой для 1.16.1
, так как различные второстепенные версии не обязательно совместимы с .
Любые изменения могут быть сделаны с выпуском новой версии MAJOR
; константы могут быть удалены или изменены, (устаревшие) функции могут быть удалены, и, конечно, любые изменения, которые обычно увеличивают число MINOR
или PATCH
(хотя может стоить перенести такие изменения в предыдущий MAJOR
версия также).
Конечно, есть факторы, которые могут еще больше осложнить это; возможно, вы разработали свою библиотеку так, чтобы один и тот же файл мог содержать несколько версий одновременно , или вы можете использовать libtool
соглашение current:revision:age
. Но это обсуждение в другой раз. :)