it-swarm.com.ru

GLIBCXX версии

Если я компилирую программу 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 ++?

35
peoro

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

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

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

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

ПРАВКА

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

0
BЈовић