GLIBCXX версии - PullRequest
       26

GLIBCXX версии

35 голосов
/ 09 ноября 2010

Если я скомпилирую программу C ++ на своей машине и запустю ее на другой (со старым программным обеспечением), я получу: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.

Фактически в моей системе glibc новее (я получил gcc-libs 4.5.1: libstdc ++. so.6.0.14) и strings /usr/lib/libstdc++.so.6 | grep GLIBCXX печатает от GLIBCXX_3.4 до GLIBCXX_3.4.14.В другой системе вместо этого он печатает только до GLIBCXX_3.4.8 (у меня есть libstdc ++. So.6.0.8).

Итак, у меня есть несколько вопросов:

  1. Почему мой компоновщик связывает двоичные файлы C ++ с версией libstdc ++ GLIBCXX_3.4.9 вместо GLIBCXX_3.4.14?

  2. Если бы я скомпилировал свой двоичный файл с версией libstdc ++ GLIBCXX_3.4, я думаю, он запустился быпочти везде.Будет ли это означать какие-либо проблемы?(Например: будет ли он использовать более старую - и, следовательно, худшую - реализацию алгоритма?)

  3. Если вместо этого я статически свяжу мою программу с моей libstdc ++, я предполагаю, что она будет работать везде;двоичный файл будет намного больше (~ 1 МБ), конечно, какие-то другие плюсы / минусы?

  4. Могу ли я заставить компоновщик связать мой двоичный файл с данной версией libstdc ++?

Ответы [ 3 ]

34 голосов
/ 09 ноября 2010

Используйте readelf -a и objdump -x для проверки файлов ELF по предпочтению strings.

На самом деле, все версии GLIBCXX_ * применяются не ко всей библиотеке, а к каждому символу (символу).управление версиями см. DSO-howto ).Таким образом, вы можете иметь, например: std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5 и std::ios_base::Init::~Init()@@GLIBCXX_3.4 в одном и том же библиотечном файле.

Тот факт, что вашей программе требуется GLIBCXX_3.4.9, вероятно, означает, что она была связана с введенным символомизменена семантика в GLIBCXX_3.4.9.

0 голосов
/ 01 июня 2016

По моему мнению, если ваши двоичные файлы не используют новые функции более новой версии GLIBCXX, то они не будут связаны с этой версией.Таким образом, ваши двоичные файлы были связаны с GLBCXX 3.4.9, из него должен быть экспортирован хотя бы один символ, и нет никаких символов, экспортированных из версии более новой, чем 3.4.9.

0 голосов
/ 09 ноября 2010
  1. Это версия библиотеки, которая установлена ​​в вашей системе. Вы могли бы вручную собрать версию 3.4.14 glibc и ссылку на нее
  2. Это зависит. Возможно, более поздняя версия исправила некоторые проблемы. Пользователи вашей программы должны будут ссылаться на версию, которая требуется вашей программе
  3. Использование памяти выше
  4. Да, передайте верный параметр компоновщику. Если вам нужна конкретная версия библиотеки, то лучше всего ее скачать, собрать вручную и связать с ней.

EDIT

Я только что вспомнил, что статически связанные библиотеки увеличивают использование памяти.

...