Я принимал участие в некоторых дебатах по поводу библиотек в Linux и хотел бы подтвердить некоторые вещи.
Насколько я понимаю (пожалуйста, исправьте меня, если я ошибаюсь, и я отредактирую свой пост позже), что есть два способа использования библиотек при создании приложения:
- Статические библиотеки (файлы .a): во время компоновки копия всей библиотеки помещается в конечное приложение, чтобы функции внутри библиотеки всегда были доступны вызывающему приложению
- Общие объекты (файлы .so). Во время соединения объект просто проверяется на соответствие его API через соответствующий файл заголовка (.h). Библиотека фактически не используется до времени выполнения, где это необходимо.
Очевидное преимущество статических библиотек состоит в том, что они позволяют полностью автономно использовать все приложение, тогда как преимущество динамических библиотек заключается в том, что файл «.so» можно заменить (т. Е. В случае необходимости его обновления из-за безопасности ошибка) без необходимости перекомпиляции базового приложения.
Я слышал, что некоторые люди делают различие между общими объектами и динамически связанными библиотеками (DLL), хотя они оба являются файлами ".so". Есть ли какое-либо различие между общими объектами и библиотеками DLL, когда речь идет о разработке C / C ++ для Linux или любой другой POSIX-совместимой ОС (например, MINIX, UNIX, QNX и т. Д.)? Мне говорят, что одно ключевое отличие (пока) заключается в том, что общие объекты просто используются во время выполнения, в то время как библиотеки DLL сначала должны открываться с помощью вызова dlopen () в приложении.
Наконец, я также слышал, как некоторые разработчики упоминали «общие архивы», которые, на мой взгляд, сами являются статическими библиотеками, но никогда не используются приложением напрямую. Вместо этого другие статические библиотеки будут связываться с «общими архивами» для извлечения некоторых (но не всех) функций / ресурсов из общего архива в создаваемую статическую библиотеку.
Спасибо всем заранее за вашу помощь.
Обновить
В контексте, в котором эти термины были предоставлены мне, это были фактически ошибочные термины, используемые командой разработчиков Windows, которые должны были изучать Linux. Я пытался их исправить, но (неправильные) языковые нормы застряли.
- Общий объект: библиотека, которая автоматически связывается с программой при запуске и существует как отдельный файл. Библиотека включается в список ссылок во время компиляции (т.
LDOPTS+=-lmylib
Е. Для файла библиотеки с именемmylib.so
). Библиотека должна присутствовать во время компиляции и при запуске приложения. - Статическая библиотека: библиотека, которая объединяется с самой программой во время сборки для одного (большего) приложения, содержащего код приложения и код библиотеки, который автоматически связывается с программой при сборке программы, и конечный двоичный файл, содержащий оба основная программа и сама библиотека существуют в виде отдельного двоичного файла. Библиотека включается в список ссылок во время компиляции (то есть:
LDOPTS+=-lmylib
для файла библиотеки с именем mylib.a). Библиотека должна присутствовать во время компиляции. - DLL: по сути то же самое, что и общий объект, но вместо того, чтобы быть включенным в список ссылок во время компиляции, библиотека загружается с помощью команд
dlopen()
/,dlsym()
так что библиотека не должна присутствовать во время сборки для компиляции программы. Кроме того, библиотека не обязательно должна присутствовать (обязательно) при запуске приложения или во время компиляции , так как это необходимо только в момент выполнения вызововdlopen
/dlsym
. - Общий архив: по сути, такой же, как статическая библиотека, но компилируется с флагами "export-shared" и "-fPIC". Библиотека включается в список ссылок во время компиляции (т.
LDOPTS+=-lmylibS
Е. Для файла библиотеки с именемmylibS.a
). Различие между ними заключается в том, что этот дополнительный флаг необходим, если общий объект или DLL хотят статически связать общий архив с собственным кодом и иметь возможность сделать функции в общем объекте доступными для других программ, а не просто использовать их. внутренний в DLL. Это полезно в том случае, если кто-то предоставляет вам статическую библиотеку, и вы хотите переупаковать ее в виде SO. Библиотека должна присутствовать во время компиляции.
Дополнительное обновление
Различие между " DLL
" и " shared library
" было просто (ленивым, неточным) разговором в компании, в которой я работал в то время (разработчики Windows были вынуждены перейти на разработку Linux, и термин застрял), придерживаясь описаний, упомянутых выше.
Кроме того, конечный « S
» литерал после имени библиотеки в случае «общих архивов» был просто соглашением, используемым в этой компании, а не в отрасли в целом.
.a
файлов «а» фактически означает «archove», и это просто архив объектных файлов. Современные компоновщики должны быть достаточно хорошими, чтобы не включать библиотеку while, только файлы объектов в архиве, которые необходимы, и могут даже просто использовать фрагменты кода / данных в объектных файлах, на которые есть ссылки.