Компиляция С++ в портативные Linux файлы

Хорошо, этот вопрос касается переносимого, как в без зависимостей (т.е. "Я могу поместить двоичные файлы в USB-ключ и принести его мне повсюду, по электронной почте их друзьям и т.д." ).

Я слышал о статической привязке, но я смущен тем, что именно является следствием этого; что может и что не может быть статическим (например, Qt, OpenGL, libstdС++?), и в какой степени двоичный файл будет впоследствии "переносимым".

Я также слышал о LSB (стандартная база Linux), но я не знаю точно, что это такое или если он может помочь в этом смысле.

Ответ 1

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

Стандартная база Linux поддерживается некоторыми дистрибутивами Linux, но на Debian (и я думаю, что Ubuntu) она должна быть установлена из пакета. Он также обрабатывает в основном административные вещи, такие как скрипты запуска, хотя в нем есть некоторые файлы для двоичной совместимости. Для получения дополнительной информации см. эту страницу.

Для требования "надеть USB-ключ и запустить где-нибудь", CDE.

Ответ 2

Вам не нужно связывать все библиотеки одинаково. Я бы определенно придерживаться динамической связи для libc, а другой системных библиотек. И используйте статические ссылки для чего-либо С++; бинарный API время от времени меняется, и вам нужно быть что версия библиотеки совпадает с версией вы собрали против - самый верный способ сделать это: статически связывать библиотеку с исполняемым файлом. Если какой-либо из другие библиотеки, которые вы используете, написаны на С++, вы, вероятно, хотят компилировать их также локально, а не использовать предварительно скомпилированный дистрибутив, чтобы обеспечить их компиляцию против одного и того же бинарного API и связывать их статически. бинарный API для C фиксирован, поэтому у вас больше свободы: если библиотека будет присутствовать при каждой установке и должна иметь версию, совместимую с версией ОС, ссылку динамически; в противном случае статически.

Ответ 3

Будьте осторожны со статическим связыванием с помощью gcc, он больше не работает. См.

Ответ 4

Чтобы разочаровать вас, нет никакого решения. Эта статическая ссылка есть, и вы можете (если хотите) соединить все static = > все зависимости из других библиотек будут удалены. Но есть и другие зависимости, которых нельзя избежать: во-первых, есть архитектура. У нас есть Linux на PowerPC, Linux на ARM, Linux на Microblaze, Linux на 32-разрядном x86 и Linux на 64-разрядном x86. Во-вторых, есть ABI и есть системные вызовы. Они могут (и действительно были в прошлом) меняться (например, экзотические/новые системные вызовы не существуют на старых системах - и если вы получили эти вызовы в своем двоичном формате, ваша программа не будет работать).

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