2010-01-18 3 views
24

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

-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-кэша для более старых версий libstdC++, чтобы установить, но, видимо, не более старые версии 6 не доступны?

ответ

18

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

Посмотрите на the GNU ABI policy. Общая библиотека 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) и начать копать. Работал для меня.

+0

Вы имеете в виду, что нам нужно установить более старую версию g ++? –

+0

@Peter Да, возьмите более старую версию g ++, которая ссылается на более раннюю версию libstdC++. Так что – Jan

+10

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

6

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

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

1

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

+1

В то время как это, безусловно, вариант, это, похоже, так много работы для просто связывания со старой библиотекой ... Надеюсь, что некоторые лучшие варианты будут опубликованы, чтобы быть честными :) – Pieter

+0

Еще один вариант - установить ту же самую версию библиотека stdC++, которая присутствует в целевой системе. Но, поскольку он не присутствует по умолчанию в вашем дистрибутиве, вам придется делать это вручную. Это не будет тривиальным, и вы получите настоящие головные боли, чтобы 2 версии сосуществовали в вашей системе. Настройка старого дистрибутива и компиляция на нем составляет пару часов (если вы не используете много экзотических библиотек), и это действительно стоит по сравнению с второй версией библиотеки. –

+0

Вам не нужно устанавливать целую систему - просто настройте вторую инструментальную цепочку, как если бы вы выполняли кросс-компиляцию, но настраивали свою собственную платформу. – ephemient

1

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

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

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

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

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

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

+0

Вам просто нужно использовать -static-libstdC++ и не нуждаться в магии symlink. – Kaa

2

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

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

0

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

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp 
+0

libstdC++ не может быть включен таким образом. Существует опция static-libC++, но обычно это не то, что вы хотите. – phord

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