Можно ли скомпилировать исходный код C / C ++, который выполняется во всех дистрибутивах Linux без перекомпиляции? - PullRequest
16 голосов
/ 18 сентября 2011

Можно ли скомпилировать исходный код C / C ++, который выполняется во всех дистрибутивах Linux без перекомпиляции?

Если ответ положительный, могу ли я использовать какие-либо внешние (нестандартные C / C ++) библиотеки?

Я хочу распространять свое двоичное приложение вместо распространения исходного кода.

Ответы [ 3 ]

36 голосов
/ 18 сентября 2011

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

  1. Компиляция 32-битная. Компилируйте для минимального уровня ЦП, который вы готовы поддерживать.

  2. Создайте свою собственную версию glibc. Используйте параметр --enable-kernel, чтобы установить минимальную версию ядра, которую вы хотите поддерживать.

  3. Скомпилируйте все остальные библиотеки, которые вы планируете использовать самостоятельно. Используйте заголовки из вашей сборки glibc и выбранные вами флаги CPU / компилятора.

  4. Ссылка статически.

  5. Для чего-либо, на что вы не можете ссылаться статически (например, если вам нужен доступ к разрешению имен системы по умолчанию или вам нужен PAM), вы должны разработать свой собственный вспомогательный процесс и API. Передайте исходный код вспомогательному процессу и дайте им (или вашему установщику) скомпилировать его.

  6. Тщательно протестируйте все платформы, которые вам нужны.

Возможно, вам придется настроить некоторые библиотеки, если они вызывают функции, которые не могут работать с этим механизмом. Это включает в себя dlopen, gethostbyname, iconv_open и так далее. (Эти виды функций в основном полагаются на динамическое связывание. См. Шаг 5 выше. При связывании вы получите предупреждение.)

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

Большинство людей, которые делают это, собирают с минимально поддерживаемым процессором Pentium 4 и минимальной поддерживаемой версией ядра 2.6.0.

4 голосов
/ 18 сентября 2011

Есть два различия между установками.Архитектура и библиотеки.

  1. Наличие одного двоичного файла для разных архитектур невозможно напрямую;была попытка создать двоичный файл для нескольких арок в одном файле ( рок-н-ролл ), но он не получил широкого распространения и вряд ли получит импульс.Поэтому, по крайней мере, вам нужно распространять отдельные двоичные файлы для ia32, amd64, arm, ... (хотя большинство, если не все дистрибутивы amd64 имеют ядро, скомпилированное с поддержкой запуска кода ia32)

  2. В дистрибутивах содержатся разные версии библиотек.Вы в порядке, пока API не меняется, вы можете ссылаться на эту библиотеку.Некоторые библиотеки обеспечивают внутреннюю обратную совместимость с основным номером (поэтому приложение GTK2.2 будет нормально работать с библиотекой GTK2.30, но не обязательно наоборот).Если вы хотите быть уверенным, вы должны статически связываться со всеми используемыми вами библиотеками, кроме самых основных (вероятно, только libc6, который является бинарно-совместимым в дистрибутивах AFAIK).Это может увеличить размер бинарного файла, и это одна из причин, по которой, например, Acrobat Reader загружается относительно много, хотя само приложение не обладает особой функциональностью.

  3. Был переходный периодпериод для c ++ ABI, который изменился между gcc 2.9 и 3 (IIRC), но старый ABI был бы действительно только на древних установках.Это больше не должно быть проблемой для вас, и если вы создаете статическую ссылку, это все равно не имеет значения.

0 голосов
/ 18 сентября 2011

Как правило, нет.

Существует несколько бариеров.

Различные архитектуры

Хотя 32-разрядный двоичный файл будет работать в системе x86_64, он выигралне работает наоборот.Кроме того, существует множество систем ARM.

Ядро ABI

Ядро ABI изменяется очень медленно, но оно меняется, поэтому вы не можете реально поддерживать все возможные версии,Обратите внимание, что в некоторых местах ядро ​​2.2 все еще используется.

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

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