Является ли lib {имя библиотеки}.a/.so соглашение об именах для статических библиотек в Linux?

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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