Варианты 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С++?
Ответы
Ответ 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.