Статическая связь с glibc и libstdc ++ - PullRequest
21 голосов
/ 09 июля 2010

Я пишу кроссплатформенное приложение, которое не совместимо с GNU GPL.Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что приложение динамически связано с glibc и libstdc ++, и почти каждое новое серьезное обновление библиотек не имеет обратной совместимости.Следовательно, в моем приложении наблюдаются случайные сбои.

В качестве обходного пути я распространяю двоичные файлы моего приложения, скомпилированные на нескольких разных системах (с разными версиями среды выполнения C / C ++).Но я хочу обойтись без этого.Итак, мой вопрос, имея в виду лицензирование и все остальное, могу ли я статически связываться с glibc и libstdc ++?Кроме того, это вызовет проблемы с rtld?

Ответы [ 4 ]

19 голосов
/ 09 июля 2010

Вам не нужно.

Скопируйте исходные библиотеки, с которыми вы связаны, в каталог (в данном примере ../lib) в папке приложения.

Как:

my_app_install_path

  1. .bin
  2. lib
  3. документация

Переименуйте ваше приложение для чего-то вроде app.bin.Замените ваше приложение небольшим сценарием оболочки, который устанавливает переменную окружения LD_LIBRARY_PATH в путь к библиотеке (и объединяет предыдущее содержимое LD_LIBRARY_PATH, если оно есть).Теперь ld сможет найти динамические библиотеки, с которыми вы связаны, и вам не нужно статически компилировать их в исполняемый файл.

Не забудьте соблюдать LGPL, добавляя указанную атрибуцию к библиотекам и указывая вдокументация, где источник может быть загружен.

9 голосов
/ 15 января 2011

Указание опции -static-libgcc для компоновщика приведет к его привязке к статической версии библиотеки C, если она доступна в системе.В противном случае оно игнорируется.

8 голосов
/ 09 июля 2010

Glibc находится под LGPL.В разделе 6. LGPL 2.1 вы можете распространять свою программу, связанную с библиотекой, при условии, что вы соответствуете одному из пяти вариантов.Во-первых, предоставить исходный код библиотеки вместе с объектным кодом (источник необязательный, необязательный) вашей собственной программы, чтобы его можно было повторно связать с библиотекой.Вы также можете предоставить письменное предложение о том же.Ваш собственный код не обязательно должен быть под LGPL, и вам не нужно выпускать исходный код.

libstdc ++ находится под лицензией GPL, но с основным исключением .По сути, вы можете просто распространять по выбранной вами лицензии без предоставления исходного кода либо для своего собственного кода, либо для libstdc ++.Единственным условием является то, что вы компилируете нормально, например, без проприетарных модификаций или плагинов для GCC.

IANAL, и вам следует рассмотреть возможность проконсультироваться с одним из них, если вам нужна реальная юридическая консультация.

0 голосов
/ 09 июля 2010

Я должен спросить, какого чёрта ты делаешь с плохими библиотечными функциями?

У меня тоже есть кроссплатформенное программное обеспечение.Он отлично работает на всех системах Linux.Сборка с самой старой версией программного обеспечения, которую вы хотите поддерживать.Библиотеки glibc и libstdc ++ действительно очень обратно совместимы.

Я построил на CentOS 4 и запускаю на бета-версии RHEL 6.Нет проблем.Я могу построить стабильный Debian и запустить его при тестировании.

Теперь у меня иногда возникают проблемы с некоторыми библиотеками, если я пытаюсь собрать, скажем, старый Debian и пытаюсь запустить его на CentOS 5.4.Обычно это связано с различными вариантами конфигурации дистрибутива, такими как выбор многопоточности или не многопоточности.

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