Компиляция С++ в портативные 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 - это просто стандарт (или лучше он пытается - не каждый следует за ним) для разных дистрибутивов, чтобы упростить администрирование, использование и поддержку (а иногда и разработку), например. определяя, где хранятся файлы. Он не нацелен на то, чтобы сделать исполняемые файлы более портативными.