Соглашения об именах библиотек
Согласно Wheeler, у нас есть 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 без указания номера версии.
Итак, чтобы сначала ответить на ваш последний вопрос, вы должны использовать 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
. Но это разговор в другой раз. :)
person
imolit
schedule
30.01.2014