Есть ли недостатки в использовании статически связанных приложений в Linux? - PullRequest
2 голосов
/ 19 мая 2009

Я видел несколько дискуссий на эту тему здесь, но хотел спросить о моей конкретной ситуации:

Если у меня есть несколько библиотек 3-й части, которые использует мое приложение, и я хотел бы связать их вместе, чтобы избавить себя от хлопот в LD_LIBRARY и т. Д., Есть ли какие-то недостатки в Linux, кроме больших? размер файла?

Кроме того, возможно ли статически связывать только некоторые библиотеки, а другие (стандартные библиотеки Linux) для динамического связывания?

Спасибо.

Ответы [ 7 ]

4 голосов
/ 23 мая 2009

Действительно возможно динамически связываться с некоторыми библиотеками и статически связываться с другими.

Похоже, что вы действительно хотите сделать, это динамически связываться с системными библиотеками и статически связываться с нестандартными, которые пользователь, возможно, не установил (или у разных пользователей могут быть разные установки).

Это вполне разумно.

Как правило, статически не рекомендуется статически связываться с системными библиотеками, особенно с libc.

Часто имеет смысл статически связываться с библиотеками, которые не поставляются с ОС и которые не будут распространяться с вашим приложением.

2 голосов
/ 19 мая 2009

Есть некоторые биты libc - те, которые используют nsswitch - которые должны загружать библиотеки динамически. Это может вызвать проблемы, если вы хотите создать полностью статический двоичный файл.

Статическое связывание сторонних библиотек с вашим приложением должно быть вполне нормальным.

1 голос
/ 19 мая 2009

Статическое связывание не только влияет на размер файла библиотеки, но также влияет на объем памяти и время запуска приложения. Динамически связанные библиотеки загружаются один раз, независимо от того, сколько программ их используют. Статически связанные библиотеки должны загружаться один раз для каждой программы, которая их использует (поскольку теперь они являются частью этой программы).

1 голос
/ 19 мая 2009

Главный недостаток, который я вижу, это то, что ваше приложение теряет все автоматические исправления, которые могут быть применены к общей библиотеке. С другой стороны, вы не получаете новых ошибок.

1 голос
/ 19 мая 2009

Чтобы ответить на ваш второй вопрос, да, возможно иметь динамические и статические библиотеки, связанные с одним и тем же приложением. Просто будьте осторожны, чтобы избежать межбиблиотечных зависимостей, чтобы у вас не было проблем с порядком библиотек. Вы должны иметь возможность перечислять библиотеки в любом произвольном порядке. Там, где я работаю, мы предпочитаем перечислять их в алфавитном порядке.

Редактировать : Чтобы связать статическую библиотеку, используйте флаг -lfoo. Чтобы добавить каталог в путь поиска библиотеки, используйте -L / path / to / libfoo.

Редактировать : Вам не нужно связывать динамическую библиотеку. Ваша программа может использовать функцию, предоставляемую вашим компилятором, для открытия динамической библиотеки во время выполнения, или вы можете связать ее во время компиляции, и компилятор разрешит символы, но не включит их в двоичный файл. См. Комментарий pjc50 ниже.

1 голос
/ 19 мая 2009

Статически связанный двоичный файл будет больше, чем если бы вы использовали разделяемую библиотеку, но я считаю, что этот недостаток перевешивает трудности с путями библиотек, при условии, что я контролирую распределение всех задействованных библиотек. Если вы зависите от определенных общих библиотек дистрибутивов, у вас нет другого выбора, кроме как использовать динамическое связывание.

0 голосов
/ 19 мая 2009

Статическое связывание сделает ваш двоичный файл громоздким, но вам не нужно иметь совместно используемую версию этой библиотеки в целевой среде выполнения. Это особенно актуально при разработке встроенных приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...