2013-11-20 2 views
2

Я новичок в программировании Linux, и мне интересно, есть ли способ запустить (не перекомпилировать) мой исполняемый файл C++ на более ранней версии Linux того же дистрибутива?Запустите мой код в старой версии linux

Пример: Скажем, я составил свой код на RHEL 6 и хочу запустить свой исполняемый файл на RHEL 4 или 5.

В Windows, когда мы делаем это, мы просто установить C++ во время выполнения версии компилятора C++.

Пример: Если я использую VS2012 для создания проекта C++ с использованием C++ 11, мне просто нужно установить C++ runtime C++ 11 на клиентской машине для запуска моего приложения независимо от того, какая версия Windows я используя (конечно, начиная с Windows XP)

+1

Это может помочь: http://stackoverflow.com/questions/2856438/how-can-i-link-to-a-specific-glibc-version – Vlad

ответ

1

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

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

+0

Но нет никакого способа, как Windows C++ runtimes ?? :( –

+1

Нет простого способа, нет. Это похоже на запуск современной среды выполнения VC++ на win9x. –

+0

@ user3012502 Если пакеты для нового libstdC++ на старой ОС (маловероятные), это будет очень похоже на VIS.NET, , вы неизбежно будете связаны с новым glibc, который может или не может вызывать новые версии символов. – rubenvb

0

На самом деле, да - Найти ваши приложения DEPS (используя например: ldd) и скопировать их (например: libstdc++.so.6) из вашей системы сборки, чтобы где-то на целевой системе (например: /mylibs). Направьте свое приложение здесь (например: используя patchelf's --rpath и --interpreter). Ваше приложение должно запускаться (протестируйте его!). Если нет, вполне вероятно, что ваш glibc несовместим со старым ядром. Вы можете решить эту проблему, перекомпилировав требуемую версию glibc для поддержки старого ядра - с помощью переключателя --enable-kernel=<version>./configure. Если ваша нужная версия glibc не поддерживает эту версию ядра, вы можете предоставить отсутствующие функции в .so и загрузить их с помощью LD_PRELOAD.

+0

Возможны только следующие проблемы: что 1) вовремя ваше распределенное приложение o фактически связано с более старыми библиотеками, и 2) район мог бы заплатять системные библиотеки по любой причине, которая могла бы сделать вашу несовместимую с остальной системой. Но да, это вариант. Примечание. Matlab предоставляет устаревший libstdC++, который приводит к сбою графических драйверов (mesa использует llvm, который использует C++ ...). Он может работать сегодня, но завтра вы все равно ввернуты. Тогда более устойчивое соединение с более старыми библиотеками. – rubenvb

+0

Вопрос явно просит «запустить (не перекомпилировать)» - ссылка на старые библиотеки не отвечает на вопрос! Вы можете уменьшить зависимости, например: путем статической привязки libstdC++. «Это может сработать сегодня, но завтра вы все равно ввернуты» - не могли бы вы рассказать об этом? Я не думаю, что дистрибутив собирается выпустить обновление, которое нарушит совместимость с Apache ядра? – user1976

+0

Ваше приложение использует фиксированную версию, например. libstdC++. Завтра дистрибутив переходит на новую версию и связывает графический драйвер с новой версией. Ваше приложение упрямо загружает старую версию в комплекте, и все не удается. – rubenvb

Смежные вопросы