Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Существуют ли ограничения на использование исполняемых файлов, скомпилированных с помощью g++ в одном дистрибутиве Linux, в другом?

Автор вопроса: ElliottОтветов: 4

Существуют ли какие-либо особенности или различия между дистрибутивами, которые могут повлиять на двоичные файлы C++, скомпилированные с помощью GCC 4.7.x в одном дистрибутиве, которые используются непосредственно в другом? Я понимаю, что идеальной ситуацией является компиляция из исходного кода на втором дистрибутиве, но я действительно предпочел бы не беспокоиться о компиляции новых версий GCC и исходного кода программы на моей производственной машине. Я относительно неопытный пользователь Linux (отсюда и вопрос!) и по-прежнему предпочитаю IDE, а не компиляцию из командной строки, ssh - это все, что я действительно могу использовать для доступа к производственной машине.

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

Любой совет будет принят с благодарностью!

  • Ответ во многом зависит от того, связываете ли вы статически или динамически. PlasmaHH 19.10.2012
  • Не должно быть проблем, если только один из них не является 64-разрядным, а другой - 32-разрядным, или если у них установлены значительно разные версии различных общих библиотек. Если вам нужна максимальная переносимость, вы должны сделать его статическим. Paul Tomblin 19.10.2012
  • @PaulTomblin: если вам нужна максимальная переносимость, вы должны скомпилировать из исходного кода. Martin York 19.10.2012
  • Спасибо за комментарии. Статическое/динамическое связывание было определенно проблемой, которую я ожидал увидеть здесь. Правильно ли я понимаю, что версия библиотек для средств ОС, таких как сокеты, привязана к версии ядра? Или они обновляются отдельно? А также являются ли компоненты среды выполнения libgcc и/или libstdС++ единственными вещами, которые я должен учитывать с точки зрения получения двоичного кода, ограниченного ядром С++, работающего на другой установке? Elliott 20.10.2012
  • Могут быть несовместимые версии библиотек (но в этом случае попытка запуска программы будет выдавать ошибку). Более коварными являются изменения в расположении файлов конфигурации и тому подобное. vonbrand 20.01.2013
  • @vonbrand: Спасибо за дополнительную пищу для размышлений! Elliott 28.01.2013

gcccc++linuxg++

Ответы

Ответ 1 · рейтинг 5 · Martin York

Если двоичные файлы не созданы на точно той же ОС (включая версию) и точно на том же оборудовании, гарантии отсутствуют.

На практике:

  1. Если аппаратное обеспечение относится к тому же семейству чипов, оно должно работать.

    • This is because most people don't turn on the hardware specific optimizations (but they can).
    • Перемещение двоичных файлов между наборами микросхем вряд ли сработает.
    • Перемещение двоичных файлов со старых на новые члены семейства оборудования, скорее всего, сработает.
    • Перемещение двоичных файлов с более новых на более старые члены аппаратного семейства маловероятно (но это будет зависеть от оптимизации и настроек компилятора (переход с 64-битной на 32-битную архитектуру вряд ли сработает).
  2. Если ОС имеет тот же основной номер, то она должна (вероятно) работать.

    • The version of OS that a binary will work across will depend on the version of the compiler used to build it and the host OS.
    • Если у компилятора есть изменения в генерируемом им ABI, то все ставки сняты. Но обычно изменение в ABI, сгенерированном компилятором, будет серьезной проблемой и, таким образом, произойдет только в основных точках дорожной карты ОС (а не в незначительных приращениях).
  3. Мой совет строить из исходников.

    • Don't specifically go out and update the development environment (use the one that comes with distribution (if you do the default updates they will not break backwards compatibility)).
    • Создать легко, просто прочитайте файл README. Но обычно это включает в себя запуск двух команд ./configure и make. Если вы не хотите ничего особенного, вам обычно не нужно ничего делать.

Ответ 2 · рейтинг 3 · Dirk Holsopple

G++ уже давно имеет стабильный ABI, так что это не должно вызывать проблем. Что может вызвать проблемы, так это использование динамически подключаемых библиотек. Система, в которой выполняется программа, должна иметь совместимые версии любых общих библиотек, с которыми был скомпилирован исполняемый файл. Если вы используете только статическую ссылку, у вас не должно возникнуть проблем. Вы можете включить статическое связывание с помощью параметра -static.

Ответ 3 · рейтинг 3 · idefixs

При статической связи должны выполняться два условия:

1) Целевая система и система сборки должны иметь одинаковую архитектуру (с исключениями: вы можете запускать 32-битные двоичные файлы на многих 64-битных хостах)

2) Пакет (g)libc в целевой системе не должен быть старше версии, чем в системе сборки (иногда вы можете избежать незначительных различий в версиях)

С динамической связью все сложнее.

Ответ 4 · Tsuneo Yoshioka

Как правило, бинарные файлы, созданные на основе более нового дистрибутива, не работают со старой версией, но двоичные файлы, созданные на основе более старого дистрибутива, будут работать с более новым дистрибутивом. На данный момент, если вы собираете двоичный файл на RedHat EL4, он будет работать в большинстве поддерживаемых дистрибутивов (вам может потребоваться скопировать libstdc++, если он отсутствует)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы