Ссылка на старую версию libstdc ++ - PullRequest
28 голосов
/ 18 января 2010

После установки новой машины для сборки я обнаружил, что она поставляется с 6.0.10 стандартной библиотеки C ++

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10

Однако многие наши целевые машины все еще используют более старую версию libstdc ++, например:

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

Я искал в apt-cache для установки более старых версий libstdc ++, но, по-видимому, более старые версии 6 недоступны?

Ответы [ 6 ]

20 голосов
/ 24 февраля 2010

Вам не нужно ссылаться на другую библиотеку, вам нужно использовать более старую версию компилятора.

Взгляните на политику GNU ABI . Совместно используемая библиотека libstdc ++ предназначена для прямой совместимости. То есть Версия 6.0.10 может быть использована, если вам нужно 6.0.8. В политике вы можете прочитать, что начиная с gcc-4.2.0, необходим 6.0.9, поэтому вам нужен gcc-4.1.x.

Короче говоря, поэтому в вашей системе только одна libstdc ++. So.6.0.x, вам нужна только последняя версия.

Что касается настройки вашей системы сборки на использование только определенной версии компилятора: убедитесь, что стандарт g ++ не может быть использован (переименуйте ссылку, удалите пакет, предоставляющий ее, выведите из PATH) и запустите рыть. Работал на меня.

7 голосов
/ 18 января 2010

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

Доставка конкретной версии, которая вам нужна, будет означать, что не имеет значения, какую версию установил пользователь. Вам просто нужно убедиться, что вы отправляете все зависимости.

2 голосов
/ 18 января 2010

Вся альтернатива, которая не работает для меня, но, возможно, кто-то найдет ее полезной, - это статически связать libgcc и libstdc ++.

gcc имеет параметр -static-libgcc, но просто с помощью этого параметраничего не достигает, так как libstdc ++ все еще динамически связан.Но, убедившись, что gcc может найти только статическую версию libstdc ++, можно добиться статической компоновки.

ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp

Проблема в том, что библиотеки boost были созданы на основе более новой libstdc ++, поэтому, хотя программа компилируется правильно, онагенерирует ошибки во время выполнения ...

Может быть, это решаемо, если я тоже перестрою boost, не пробовал этого.

(для записи, если вы используете любой код, который динамически загружает библиотеки черезнапример, dlopen, статическое связывание - все это исключено)

2 голосов
/ 18 января 2010

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

1 голос
/ 19 января 2010

Вы можете «переправить» более новую версию libstdc ++ в клиентские системы (в приватную область) и связать программы с подходящим -rpath, либо вы можете получить старую версию libstdc ++ на свой компьютер. Это не похоже на то, что вам нужно обновление, и это может быть и речи по другим причинам.

Примечание: во FreeBSD libstdc ++ связан с компилятором (у меня установлены gcc4.2, 4.4 и 4.5, каждый со своим собственным libstc ++). Попробуйте установить более старую (соответствующую клиентским системам) версию gcc, она может содержать более старую версию libstdc ++, которую вы ищете.

0 голосов
/ 25 января 2010

Вы пытались просто добавить его в список источников? Это предполагает, что на самом деле у вас установлена ​​библиотека!

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...