libstdc ++. so.6: версия GLIBCXX_3.4.20 не найдена - PullRequest
0 голосов
/ 03 декабря 2018

Прежде всего, знайте, что я очень плохо знаком с c ++ и Ubuntu.

У меня есть программа, которую я пытаюсь скомпилировать с помощью GCC (моя версия - gcc 4.8.4) с использованием make-файла.,Проблема в том, что исполняемый файл создается в каталоге, в котором он работает, но когда он копируется в любой другой (или даже принудительно создается там в make-файле), он говорит.

/usr/lib/i386-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 

Также, когда я проверяюдля версий со строками /usr/lib/x86_64-linux-gnu/libstdc++.so.6 |grep GLIBCXX, я получаю:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

Насколько я читал в Интернете, проблема в том, что GLIBCXX_3.4.20 поддерживается только gcc 4.9 и выше, в то время как я использую 4.8.4, но все ещеЯ не понимаю, почему он будет работать в определенном каталоге, а не в других.

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4) 

Поскольку у меня нет прав для обновления gcc, я хотел бы знать, что я могу сделать, чтобы решитьэто ... Какие вещи я должен избегать использовать в коде, которые требуют GLIBCXX_3.4.20?Могу ли я заставить компилятор как-то использовать более старую версию этой библиотеки или включить эту конкретную библиотеку в двоичный файл?(Я не могу понять, почему это будет работать в каталоге, если у меня нет необходимой библиотеки)

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

1 Ответ

0 голосов
/ 06 декабря 2018

Я пытался комментировать и раскомментировать все части кода, и я получил ответ, что именно функция string.find () является той, которая доставляет мне эту проблему.

Яростная активность не заменит понимание.

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

Ваша первая задача - выяснить, какие версии libstdc++.so.6 когда используются.Вы можете сделать это с помощью:

cd /path/to/specific/directory
LD_DEBUG=files,libs /path/to/binary ...args...

и сравнить вывод с

cd /tmp
LD_DEBUG=files,libs /path/to/binary ...args...

Как только вы узнаете путь к рабочему libstdc++.so.6, вам необходимо выяснить, почему выИспользуете его только некоторое время, а не все время.

Распространенные причины включают наличие относительного пути в переменной LD_LIBRARY_PATH среды (плохо) или в RPATH или RUNPATH самого бинарного файла или одной из библиотек, от которых он зависит.

Вы можете проверить RPATH следующим образом:

readelf -d /path/to/binary | egrep 'RPATH|RUNPATH'

Ваш последний шаг должен бытьизбавиться от относительных путей (откуда бы они ни исходили - они никогда не являются хорошей идеей), и организовать правильную версию libstdc++.so.6, которая будет всегда (обычнопредоставив -Wl,-rpath=/path/to/desired/directory во время соединения).

После того, как вы это сделаете, ваша программа должна работать правильно, независимо от того, из какого каталога вы ее вызвали.

...