Automake: каковы допустимые значения *_la_LDFLAGS в Makefile.am?

Мне интересно, каково возможное значение *_la_LDFLAGS в Makefile.am?

Если я задаю этот вопрос, это потому, что я хотел бы следующее:

Actual shared library : libA.so (or with the version number I don't care)
Symbolic links :        libA-X.Y.Z.so, libA-X.so, libA.so 
soname :                libA-X.so

Однако вот что я получаю, используя флаг -release:

Actual shared library : libA-X.Y.Z.so
Symbolic links :        libA.so 
soname :                libA-X.Y.Z.so    !!! this is not what I want 

Я также пробовал вообще без флагов и получил

Actual shared library : libA-0.0.0.so    !!! 0.0.0 and not the real version
Symbolic links :        libA.so, libA-0.so
soname :                libA-0.so        !!! 0.0.0 and not the real version

Как мне поступить? какой флаг мне использовать?

заранее спасибо


person Barth    schedule 31.10.2008    source источник


Ответы (2)


Вы должны использовать опцию -version-info Libtool, чтобы указать версию интерфейса библиотеки, но обязательно прочитайте как работает управление версиями (или здесь для официального руководства.)

Вы можете дополнительно поиграть с -release, чтобы сделать номер версии вашего пакета более очевидным, но я сомневаюсь, что вы когда-нибудь получите именно то название, которое вам нужно. Libtool имеет свой собственный набор правил для определения того, как назвать файл и какие символические ссылки создавать в зависимости от системы: на самом деле их следует рассматривать как детали реализации того, как устанавливается разделяемая библиотека.

person adl    schedule 01.11.2008

ИМХО, раскладка, которую вы хотите, сломана. Приложения, связанные с вашей библиотекой, будут зависеть от libA-X.so из-за soname. Но что происходит, когда libA.so имеет версию X+1? На что будет указывать символическая ссылка libA-X.so?

Идея макета, который вы получаете с флагом -release, заключается в том, что когда приложение связывается с -lA, это приводит к тому, что оно связывается с последней версией. Тогда из-за soname он будет зависеть от libA-X.Y.Z.so во время выполнения. Когда вы устанавливаете новую версию библиотеки, это установит новую libA-X.Y.Q.so, но оставит старую в покое — точно так, как ожидают старые приложения, которые зависят от нее. Новые приложения по-прежнему будут ссылаться на последнюю версию из-за символической ссылки libA.

Годы размышлений некоторых очень умных людей привели к созданию схемы управления версиями, которая позволяет новым приложениям связываться с последней версией библиотеки, в то же время позволяя нескольким версиям мирно сосуществовать, чтобы удовлетворить зависимости для приложений, которые в них нуждаются. Мой совет: не сомневайтесь во всем этом.

person Sherm Pendley    schedule 01.11.2008
comment
Ну, я понимаю, что вы говорите. Однако представьте, что у меня есть библиотека B, связанная с libA-X.Y.Z.so, и я выпускаю libA-X.Y.Q.so. Если я создаю RPM и использую YUM, я должен указать для пакета B, что libA = X.Y.Z вместо libA ›= X.Y.Z, и у меня такое ощущение, что это слишком ограничительно, поскольку... - person Barth; 01.11.2008
comment
lib B может без проблем использовать более старшую версию. Вы можете увидеть этот другой вопрос, чтобы лучше понять, что беспокоит меня при использовании -release : stackoverflow.com/questions/252819/ - person Barth; 01.11.2008