Версия компилятора libstdc++ и версия системы
Я пытаюсь понять, как g++ выбирает, с какой версией libstdc++ он связывается и что это означает, когда "системная" версия библиотеки отличается.
Я использую gcc / g++ 4.1.2, который согласно ABI руководящие принципы doc, включает libstdc++.Итак.6.0.8, и конечно же:
-rwxr-xr-x 1 root root 4397810 May 18 2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8
основываясь на моем понимании прямой совместимости ABI, я могу построить с g++ 4.1.2 и ожидать, что код будет работать в системе с более поздней версией libstdc++ чем 6.0.8, но не на одном с более ранней версией, потому что это будет иметь более старую версию ABI.
на той же машине есть более старая версия libstdc++ в /usr / lib:
-rwxr-xr-x 1 root root 804288 Jul 22 2005 /usr/lib/libstdc++.so.6.0.3
Если я компилирую код с помощью g++ 4.1.2 на этой машине, то ldd его, я вижу версию libstdc++ в /usr/lib, на которую ссылается, что 6.0.3:
# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.
Это ожидается, так как сначала проверяется /usr/lib. И приложение работает нормально.
мой вопрос в том, что здесь произошло?
имеет G++ 4.1.2, связанный с версией libstdc++.так это часть этого выпуска (6.0.8)? Если да, то как исполняемый файл может использовать более старую версию в /usr/lib во время выполнения, когда у этого есть более старый ABI? Удача?
или g++ 4.1.2 взял/usr / lib версию libstdc++ (6.0.3) во время ссылки и использовал это, потому что он разрешает пути библиотеки так же, как исполняемые файлы во время выполнения? Может ли g++ сделать это, даже если libstdc++ не его" собственная " версия? Какова цель версии libstdc++ в g++4.1.2 (6.0.8)? Использовался ли он вообще в этом процессе?
любые идеи оценены.
2 ответов
GCC выбирает все библиотеки в соответствии со списком поиска каталогов. Вы можете видеть это так:
gcc -print-search-dirs
список обычно предпочитает библиотеки, специфичные для версии компилятора, если таковая имеется.
однако выбор времени соединения может отличаться от выбора времени выполнения.
Если команда компоновщика включает -rpath
вариант (некоторые поставщики toolchain могут включать нестандартный), то динамический компоновщик будет использовать это, чтобы найти правильные библиотеки в время выполнения. В противном случае система будет использовать библиотеку по умолчанию.
Если две библиотеки не совпадают, то могут произойти плохие вещи. Библиотека C (обычно glibc) всегда была осторожна в поддержании совместимости. Библиотека C++ не всегда имела такую роскошь. Это было безопаснее в последние годы, но многие люди по-прежнему рекомендуем не смешивания и сопоставления.
по умолчанию gcc использует библиотеки в пути /usr/lib.
1. gcc / g++ 4.1.2 не связан с последней версией libstdc++.так что ... .6.0.8.
2. g++ 4.1.2 взял/usr / lib версию libstdc++ (6.0.3) во время ссылки.
Он по-прежнему использует системный libstdc++по умолчанию.Итак.6.0.3 Если путь к библиотеке не задан явно.
для gcc / g++ 4.1.2, чтобы использовать последнюю версию libstdc++.Итак.6.0.8, вы должны будете экспортировать путь к библиотеке перед компиляцией.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc4.1.2/lib
теперь при связывании с помощью gcc / g++ 4.1.2, libstdc++.Итак.6.0.Будет использовано 8.