Подтвердить что ты не робот

Ссылка со старой версией 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?

4b9b3361

Ответ 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