Разница между общими объектами (.so ), статические библиотеки (.a) и библиотеки DLL (.so)?

Я участвовал в некоторых дебатах относительно библиотек в Linux и хотел бы подтвердить некоторые вещи.

Насколько я понимаю (пожалуйста, поправьте меня, если я ошибаюсь, и я отредактирую свой пост позже), что есть два способа использования библиотеки при сборке приложения:

  1. Статические библиотеки (.a файлы): во время компоновки копия всей библиотеки помещается в конечное приложение, чтобы функции в библиотеке всегда были доступны вызывающему приложению.
  2. Общие объекты (файлы .so): во время компоновки объект просто сверяется с его API через соответствующий файл заголовка (.h). Библиотека фактически не используется до времени выполнения, где она необходима.

Очевидным преимуществом статических библиотек является то, что они позволяют всему приложению быть автономным, в то время как преимущество динамических библиотек заключается в том, что файл «.so» можно заменить (например, в случае, если его необходимо обновить из-за к ошибке безопасности) без перекомпиляции базового приложения.

Я слышал, что некоторые люди проводят различие между общими объектами и динамически подключаемыми библиотеками (DLL), несмотря на то, что они оба являются файлами ".so". Есть ли какое-либо различие между общими объектами и библиотеками DLL, когда речь идет о разработке на C/C++ в Linux или любой другой ОС, совместимой с POSIX (например, MINIX, UNIX, QNX и т. д.)? Мне сказали, что одно ключевое отличие (пока) заключается в том, что общие объекты используются только во время выполнения, в то время как библиотеки DLL должны быть открыты сначала с помощью вызова dlopen() внутри приложения.

Наконец, я также слышал, как некоторые разработчики упоминали «общие архивы», которые, насколько я понимаю, сами по себе являются статическими библиотеками, но никогда не используются приложением напрямую. Вместо этого другие статические библиотеки будут ссылаться на «общие архивы», чтобы вытащить некоторые (но не все) функции/ресурсы из общего архива в создаваемую статическую библиотеку.

Заранее всем спасибо за помощь.

Обновление


В контексте, в котором мне были предоставлены эти термины, это были фактически ошибочные термины, используемые командой разработчиков Windows, которым пришлось изучать Linux. Я пытался их исправить, но (неправильные) языковые нормы застряли.

  1. Общий объект: библиотека, которая автоматически подключается к программе при ее запуске и существует как отдельный файл. Библиотека включается в список компоновки во время компиляции (например: LDOPTS+=-lmylibдля файла библиотеки с именем mylib.so). Библиотека должна присутствовать во время компиляции и при запуске приложения.
  2. Статическая библиотека: библиотека, которая объединяется с самой программой во время сборки для одного (более крупного) приложения, содержащего код приложения и код библиотеки, который автоматически связывается с программой при сборке программы, и окончательный вариант. двоичный файл, содержащий как основную программу, так и саму библиотеку, существует в виде отдельного автономного двоичного файла. Библиотека включается в список компоновки во время компиляции (например: LDOPTS+=-lmylibдля файла библиотеки с именем mylib.a). Библиотека должна присутствовать во время компиляции.
  3. DLL: по существу то же самое, что и общий объект, но вместо того, чтобы включаться в список компоновки во время компиляции, библиотека загружается через dlopen()/ dlsym()команды, так что библиотека не должна присутствовать во время сборки для компиляции программы.Также библиотека не обязательно должна присутствовать (обязательно) при запуске приложения или во время компиляции, так как она нужна только в тот момент, когда dlopen/ dlsymзвонки совершаются.
  4. Общий архив: По существу то же самое, что и статическая библиотека, но компилируется с флагами «export-shared» и «-fPIC». Библиотека включается в список компоновки во время компиляции (например: LDOPTS+=-lmylibSдля файла библиотеки с именем mylibS.a).Различие между ними заключается в том, что этот дополнительный флаг требуется, если общий объект или DLL хотят статически связать общий архив со своим собственным кодом И иметь возможность сделать функции в общем объекте доступными для других программ, а не просто использовать их. внутри DLL. Это полезно в том случае, когда кто-то предоставляет вам статическую библиотеку, и вы хотите переупаковать ее как SO. Библиотека должна присутствовать во время компиляции.

Дополнительное обновление

Различие между «DLL» и «общая библиотека» было просто (ленивым, неточным) разговорным языком в компании, в которой я работал в то время ( Разработчики Windows вынуждены перейти на разработку Linux, и этот термин закрепился), придерживаясь описаний, отмеченных выше.

Кроме того, конечный литерал " S" после имени библиотеки в случае "общих архивов" был просто соглашением, используемым в этой компании, а не в отрасли в целом.

254
задан weshouman 25 September 2019 в 03:22
поделиться