Компиляция C ++ в переносимые исполняемые файлы Linux - PullRequest
11 голосов
/ 06 апреля 2011

Хорошо, этот вопрос о портативном , как и в без зависимостей (т. Е. «Я могу поместить двоичные файлы в USB-ключ и взять его с собой повсюду, отправив их по электронной почте надрузья и т.д.что может и что не может быть статически связано (т.е. как насчет Qt, OpenGL, libstdc ++?) и в какой степени двоичный файл будет «переносимым» впоследствии.

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

Ответы [ 4 ]

7 голосов
/ 06 апреля 2011

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

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

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

5 голосов
/ 06 апреля 2011

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

1 голос
/ 06 апреля 2011

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

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

1 голос
/ 06 апреля 2011

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

...