Как настроить libstdc++ с GCC 4.8?


Некоторое время назад я решил перейти на GCC 4.8, чтобы пораньше начать работу с некоторыми функциями c++11. Однако я немного отвлекся и действительно не использовал никаких новых функций до проекта несколько дней назад (новый компилятор, казалось, работал нормально, но это может быть просто потому, что я не использовал никаких новых функций.)

В этом новом проекте, когда я компилировал с флагом =std=c++11, у меня не было никаких проблем. Однако во время выполнения я получаю ошибку:

./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: versionGLIBCXX_3.4.18' не найден (требуется ./ main) '

Я предполагаю, что существует проблема, связанная с более современной библиотекой libstdc++, связанной с GCC 4.8, но я не могу понять, как это исправить или где должна быть соответствующая библиотека. Я помню, как символически связывал двоичные файлы g++ и gcc с gcc-4.8, который, похоже, работает, так как g++ -v возвращает:

Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/app/gcc/4.8.0/libexec/gcc/i686-pc-linux-gnu/4.8.0/lto-wrapper Target: i686-pc-linux-gnu Configured with: ./gcc-4.8.0/configure --prefix=/app/gcc/4.8.0 Thread model: posix gcc version 4.8.0 (GCC)

Другой поток онлайн привел меня к просмотру вывода ldd для программы, которая действительно показала мне, что структура каталогов для библиотек libstdc++, с которыми связаны, отличалась от структуры каталогов для двоичных файлов. Однако я не смог найти соответствующие библиотеки libstdc++ в последнем, поэтому я не уверен, где искать. Выходные данные для ldd main:

./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: versionGLIBCXX_3.4.18' не найден (требуется ./главный) linux-gate. so. 1 => (0xb7791000) с libstdc++.так.6 => /usr и/lib в/для i386-линукс-дистрибутив GNU/libstdc++в.так.6 (0xb768e000) libm.так.6 => /lib в/для i386-линукс-дистрибутив GNU/libm.так.6 (0xb7662000) libgcc_s.так.1 = > в /lib/i386 в-линукс-дистрибутив GNU/libgcc_s.так.1 (0xb7644000) библиотеки libc.так.6 => /lib в/для i386-линукс-дистрибутив GNU/библиотеки libc.так.6 (0xb749b000) /lib/ld-linux. so. 2 (0xb7792000) '

Я точно не знаю, где это происходит, и я продолжу гуглить и искать ответы, но любая помощь, которую вы, ребята, можете предложить, будет очень признательна. Если что-то неясно по этому вопросу или я забыл какую-то информацию, просто дайте я знаю,и я постараюсь добавить это. Большое спасибо!
1 9

1 ответ:

Вам нужно сообщить своему динамическому компоновщику (он выполняется при запуске программы), где найти библиотеку. Задайте LD_LIBRARY_PATH путь к библиотеке (вероятно, где-то под /app/gcc/4.8.0/lib или что-то еще).

Используйте find /app/gcc/4.8.0 -name "libstdc++.so.6". Добавить каталог в переменной LD_LIBRARY_PATH. например, с тем путем, который я упомянул:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/gcc/4.8.0/lib (Если вы используете оболочку типа bourne, которая используется по умолчанию в Linux).

Затем попробуйте запустить свою программу.

Если это работает, вы, вероятно, захотите настроить динамический компоновщик поиск в каталоге без использования LD_LIBRARY_PATH. Подробнее о настройке пути см. В разделе man ld.so.