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