Linux, скомпилировать кусок кода на одном хосте, чтобы запустить на другом?

Код написан на c / c ++ , может зависеть от некоторых библиотек на компилирующем хосте; и он должен работать на другом хосте без проблем, связанных с библиотеками. Оба хоста - linux, могут иметь разные версии. У вас есть хорошая стратегия?


person shenyan    schedule 09.10.2012    source источник
comment
возможно, легко установить динамическую библиотеку, которая необходима   -  person logoff    schedule 09.10.2012


Ответы (4)


Чистая статическая компоновка в Linux не рекомендуется, это действительно возможно, только если вы используете альтернативный libc (например, dietlibc), который не подходит для C ++, мой favoured подход заключается в создании приложения на самой старой версии Linux, которую вы должны поддерживать, поскольку новые сборки libc будут иметь обратную совместимость.

Это будет охватывать только libc, другие требования, такие как gtk, pangom и т. Д., Должны быть скомпилированы непосредственно в ваш двоичный файл.

person Gearoid Murphy    schedule 09.10.2012

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

Другие решения включают:

  • Отправьте необходимые библиотеки вместе с приложением и переопределите системную переменную LD_LIBRARY_PATH, чтобы сделать включенные версии предпочтительными.
  • Напишите код для динамической загрузки библиотек с помощью dlopen() и его друзей и обработайте различия в версиях библиотек вручную.
person unwind    schedule 09.10.2012

Большинство платформ имеют четко определенный ABI, охватывающий код C, но ABI, охватывающие функциональность C ++, еще не распространены.

Программа, написанная на C ++ с использованием только libc, может не работать на другой платформе. если двоичная совместимость является важной проблемой, рассмотрите возможность использования c.

person arash kordi    schedule 09.10.2012
comment
как вы думаете, почему библиотека c ++ не может сохранить двоичную совместимость, а c может? - person BЈовић; 09.10.2012
comment
для C ++ есть 3 основные категории: Itanium C ++ ABI, Microsoft ABI и другие. вы просто не можете ссылаться на библиотеку с ABI, отличным от вашего. и по моему собственному опыту, простой исполняемый файл hello world, написанный на стандартном дистрибутиве Fedora 14, вызывал ошибку seg на debian lenny (я не помню версии библиотеки !!) - person arash kordi; 09.10.2012

Примите во внимание все ответы на этот вопрос (статическое связывание, компиляция в самой старой версии Linux и т. Д.), А затем проверьте окончательный двоичный файл с помощью Linux App Checker, чтобы показать проблемы совместимости с другими дистрибутивами Linux.

введите описание изображения здесь

person linuxbuild    schedule 10.10.2012