Ссылка со старой версией libstdС++
После установки новой машины сборки я обнаружил, что она поставляется с 6.0.10 стандартной библиотеки С++
-rw-r--r-- 1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10
Однако многие из наших целевых компьютеров по-прежнему используют более старую версию libstdС++, например:
-rwxr-xr-x 1 root root 985888 Aug 19 21:14 libstdc++.so.6.0.8
По-видимому, ABI изменился в последних двух 0.0.1, так как попытка запустить результаты программы в
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
Я попытался явно установить более старую версию gcc, но это не помогло.
Модернизация целевых машин не в моих силах, поэтому не вариант. Какой лучший способ заставить мои сборки работать на машинах со старым libstdС++?
Я искал в apt-кеше для более старых версий libstdС++ для установки, но, видимо, не существует более старых версий из 6?
Ответы
Ответ 1
Вам не нужно ссылаться на другую библиотеку, вам нужно использовать более старую версию компилятора.
Посмотрите политика GNU ABI. Общая библиотека libstdС++ предназначена для обеспечения совместимости с переходом. То есть версия 6.0.10 может быть использована, если вам нужно 6.0.8. В политике вы можете прочитать, что от gcc-4.2.0 требуется 6.0.9, поэтому вам нужен gcc-4.1.x.
Короче говоря, поэтому в вашей системе есть только один libstdС++. so.6.0.x, вам нужно только самое последнее.
Что касается настройки вашей системы сборки для использования только конкретной версии компилятора: убедитесь, что стандарт g++ не может быть использован (переименуйте ссылку, удалите предоставленный пакет, вытащите ее из PATH) и запустите рыть. Работал для меня.
Ответ 2
Вы можете отправить необходимые общие библиотеки с помощью своего собственного кода (например, в подкаталог) и установить LD_LIBRARY_PATH в качестве предшественника для запуска вашего приложения для первого поиска в этом каталоге.
Доставка определенной версии, которая вам нужна, будет означать, что не имеет значения, какая версия установлена пользователем. Вам просто нужно убедиться, что вы отправляете все зависимости.
Ответ 3
Вы можете "перетащить" новый libstdС++ в клиентские системы (в приватную область) и связать программы с соответствующим -rpath
, или вы можете получить более старую версию libstdС++ на свой компьютер. Это не похоже, что вам нужно обновление, и в любом случае это может быть и по другим причинам.
Примечание: на FreeBSD libstdС++ связан с компилятором (у меня установлены gcc4.2, 4.4 и 4.5, каждый из которых имеет собственный libstС++). Попробуйте установить более старую (соответствующую клиентской системе) версию gcc, она может содержать старый libstdС++, который вы ищете.
Ответ 4
Уже столкнулся с этим. Я не думал ни о чем лучше, чем устанавливать систему (виртуализованную?) С той же конфигурацией, что и целевые машины, для создания дистрибутивных двоичных файлов.
Ответ 5
Альтернатива al, которая не сработала для меня, но, возможно, кому-то это будет полезно, это статическая ссылка libgcc и libstdС++.
gcc имеет опцию -static-libgcc
, но просто использование этой опции ничего не достигает, поскольку libstdС++ по-прежнему динамически связан. Но, убедившись, что gcc может найти только статическую версию libstdС++, может быть достигнуто статическое связывание.
ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp
Проблема в том, что библиотеки boost были созданы против нового libstdС++, поэтому, пока программа компилируется правильно, она генерирует ошибки времени выполнения...
Возможно, это разрешимо, если я тоже перестрою boost, не пробовал это.
(для записи, если вы используете какой-либо код, который динамически загружает библиотеки, например, dlopen
, статическая ссылка вообще не может быть и речи)
Ответ 6
Вы пробовали просто включить его в список источников? Это предполагает, что у вас на самом деле установлена библиотека!
g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp