Подтвердить что ты не робот

Варианты GLIBCXX

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

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

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

  • Почему мой компоновщик связывает бинарные файлы С++ с версией libstdС++ GLIBCXX_3.4.9 вместо GLIBCXX_3.4.14?

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

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

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

4b9b3361

Ответ 1

Используйте 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.

Ответ 2

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

ИЗМЕНИТЬ

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

Ответ 3

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