Является ли 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