проблема с другим дистрибутивом Linux с исполняемым файлом C ++ - PullRequest
2 голосов
/ 26 января 2010

У меня есть код на С ++, который отлично работает на моей машине с Linux (Ubuntu Karmic). Когда я пытаюсь запустить его в другой версии, все общие библиотеки отсутствуют.

Есть ли способ объединить все общие библиотеки в один исполняемый файл?

Edit: Я думаю, что задал неправильный вопрос. Я должен был попросить способ статического связывания моего исполняемого файла, когда он уже собран. Я нашел ответ в горностай & стабилизатор

Ответы [ 6 ]

6 голосов
/ 26 января 2010

Существуют 3 возможные причины отсутствия общих библиотек:

  • вы используете разделяемые библиотеки, которые не существуют по умолчанию в другом дистрибутиве, или вы установили их на своем хосте, но не на другом, например libDBI.so
  • вы указали версию во время ссылки, например, libz.so.1.2.3, а другая машина имеет API-совместимый (основная версия 1), но отличается вспомогательной версией 2.3, которая, вероятно, будет работать с вашей программой, если только она будет связывать
  • основная версия библиотеки изменилась, что означает, что она несовместима libc.so.2 против libc.so.1.

Исправления:

  • не связывайте библиотеки, в которых вы не нуждаетесь, которые могут отсутствовать в разных дистрибутивах, ИЛИ не устанавливайте дополнительные библиотеки на других компьютерах вручную или устанавливайте их в зависимости от вашего установочного пакета (например, используйте RPM)
  • не указывайте версии так тесно в командной строке - ссылка libz.so.1 вместо libz.so.1.2.3.
  • скомпилировать несколько версий для разных версий libc.
4 голосов
/ 26 января 2010

То, что вы описываете, - это использование статических библиотек вместо общих библиотек.

2 голосов
/ 26 января 2010

Было несколько технических решений исходной проблемы, отмеченной здесь, например,

скомпилировать несколько версий против разные версии libc.

или

установить дополнительные библиотеки на другие машины

но если вы находитесь в положении ISV, на самом деле есть только одно разумное решение:

Получите чистую установку более старой системы (например, Ubuntu 6.x, если вы ориентируетесь на рабочие столы, возможно, еще в Red Hat 9, если вы ориентируетесь на серверы) и создайте на ней свое программное обеспечение. Как правило, библиотеки (и определенно libc) обратно совместимы, поэтому у вас не будет проблем с запуском на более новых системах.

Конечно, если у вас нестандартные или недавние зависимости lib, это не решит проблему полностью. В этом случае, как и предполагали другие, если вы хотите быть устойчивым, лучше использовать dlopen () и сообщать о проблемах (или запускать с ограниченной функциональностью).

1 голос
/ 13 декабря 2010

Другое возможное решение - использование стабилизатора (http://statifier.sf.net) или горностая (http://magicErmine.com)). Оба они способны упаковать динамический исполняемый файл и все необходимые библиотеки в один автономный исполняемый файл

1 голос
/ 26 января 2010

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

1 голос
/ 26 января 2010

Я не слишком уверен, но вы можете создать свой исполняемый файл, статически связав все библиотеки.

...