libstdc ++ GLIBCXX версии ошибок - PullRequest
       27

libstdc ++ GLIBCXX версии ошибок

7 голосов
/ 22 августа 2011

, когда я компилирую программу c ++ на своем компьютере с помощью g ++ и переношу исполняемый файл, чтобы запустить его на моем университетском сервере, я получу

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main)

Программа хорошо работает на моем компьютере, и у меня нет привилегий устанавливать какое-либо новое программное обеспечение на моих университетских серверах.

любая помощь? Спасибо

Ответы [ 4 ]

7 голосов
/ 22 августа 2011

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

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

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

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

Решения:

a) Чтобы избежать всех этих проблем, используйте staticсвязывание вместо динамического связывания.Я не уверен, возможно ли это с помощью stdlib, но я думаю, что стоит протестировать его (см .: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html и искать флаг "-static")

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

в) Постарайтесь узнать, какая версия stdlib установлена ​​там, и установите ту же версию на свой компьютер компилятора.

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

Надеюсь, это поможет.

PS: Здесь у вас есть хорошее введение в статические и совместно используемые / динамические библиотеки http://www.network -theory.co.uk / docs / gccintro / gccintro_25.html

И здесь (http://en.wikipedia.org/wiki/Library_%28computing%29) не очень хорошее, но более полное описание библиотеки.

4 голосов
/ 22 августа 2011

Версия libstdc++.so.6 устарела на университетском компьютере.У вас есть два варианта:

  1. Статически связать с -static.Затем библиотека C ++ будет объединена в окончательный двоичный файл.
  2. Скопируйте правильную версию в какое-нибудь место в вашем домашнем каталоге, а затем назовите ее, передав -rpath /path/to/library/directory во время сборки, или установив переменную среды LD_LIBRARY_PATHуказать на каталог, содержащий более новые libstdc++.so.6.
3 голосов
/ 22 августа 2011

Вы можете скопировать свою версию /usr/lib/libstdc++.so.6 в подкаталог вашего домашнего каталога сервера, скажем ~/lib, а затем запустить:

$ LD_LIBRARY_PATH=$HOME/lib ./main

Или, если вы предпочитаете

$ export LD_LIBRARY_PATH=$HOME/lib
$ ./main

И программа должна загрузить вашу личную библиотеку вместо системной.

1 голос
/ 22 августа 2011

Для каких платформ вы пытаетесь скомпилировать?т. е. «Ваш компьютер» и «Университетские серверы»?

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

Cheers,

...