Является ли lib {имя библиотеки} .a / .so соглашением об именах статических библиотек в Linux? - PullRequest
12 голосов
/ 03 июля 2011

Недавно мне пришлось заняться небольшим программированием в системе Ubuntu (в которой я начинающий крайне низкоуровневый пользователь), и я действительно просто знакомлюсь с make-файлами.

Я заметил, что аргументы, указывающие компоновщику, какие библиотеки включать, всегда были -l {имя библиотеки}, где соответствующей библиотекой будет что-то с именем "lib {имя библиотеки} .a" в папке / usr / lib.

Мне интересно: это конвенция? Я бы подумал, что мне нужно будет набрать -llibNAME, чтобы найти библиотеку с именем libNAME.a, но, похоже, она предполагает префикс lib.

Это всегда так? Могу ли я назвать библиотеку без использования префикса lib?

Ответы [ 4 ]

18 голосов
/ 03 июля 2011

Вы можете назвать его любым способом, каким хотите, но ld -l при условии, что префикс lib применяется как к статическим, так и к разделяемым библиотекам и идет очень далеко;вам нужно было бы назвать его явно, чтобы использовать его без префикса lib.

Это на самом деле полезно даже в современных системах: имя libfoo.so может быть идентифицировано как библиотека времени ссылки, тогда как foo.so указывает на общий объект, реализующий плагин времени выполнения.Или специфичные для подсистемы префиксы вместо lib для идентификации плагинов для определенных подсистем;см. например pam_*.so и nss_*.so.

12 голосов
/ 03 июля 2011

name.a - это статическая библиотека (a, потому что это архив объектов).

name.so - это динамическая библиотека (so, потому что это общий объект, также известный какDSO, для динамического общего объекта).

Переключатель компоновщика -lfoo традиционно принимает имя формы libfoo.{so,a} и ищет его по пути к библиотеке.Вы также можете передать имя библиотеки напрямую компоновщику (без использования ключа -l), но в этом случае вам придется явно указать путь к библиотеке.

Как отмечалось @geekosaur, если выоткрыть общий объект во время выполнения, dlopen() принимает полное имя файла.

3 голосов
/ 03 июля 2011

На самом деле, нет . Я имею в виду, почти ! Вы смешиваете статические библиотеки с разделяемыми библиотеками. Статические библиотеки - это .a файлы, а общие библиотеки заканчиваются на .so.

Подводя итог, вы говорите об общих библиотеках, хорошо? При связывании вашего приложения с общими библиотеками вам необходимо использовать стандартное соглашение: -lNAME, где NAME относится к libNAME.so

3 голосов
/ 03 июля 2011

Короткий ответ, да, это соглашение.

Опция

g ++ '-l проверит наличие lib {somename} .so в вашем lib и локальных путях.

Однако в UNIX вы также можете использовать символические ссылки, так что вы можете иметь разные версии библиотек без необходимости изменять скрипты make.

изменить, чтобы добавить:

Как кто-то указал в комментарии, .a является расширением для статической библиотеки, в то время как .so является общей библиотекой.

...