Кто определяет GLIBCXX_version при сборке двоичного файла с использованием g ++? - PullRequest
2 голосов
/ 19 марта 2019

Я создаю самодельную разделяемую библиотеку, используя G ++ 4.9.3 на Centos 6.8.

В этой библиотеке используются boost :: interprocess :: file_lock и версия boost is 1.41.0.

Я не работаю в нескольких средах ... Я просто использую устройство и никогда не менял среду сборки после сборки библиотеки.

Когда я собираю библиотеку, g ++ хорошо ее строит. Но когда я запускаю его, связывая с двоичным файлом, он показывает "./ a.out: /usr/lib64/libstdc++.so.6: версия` GLIBCXX_3.4.15 'не найдена (требуется ./libmylib.so)".

Итак, я проверил, какие версии поддерживаются libstdc ++, и он показывает, что он не поддерживает GLIBCXX выше 3.4.13. GLIBCXX_3.4.13 - это последняя версия поддержки /usr/lib64/libstdc++.so.6.

Даже если я работаю на устройстве и его libstdc ++ не поддерживает GLIBCXX_3.4.15, для сборки библиотеки с моего устройства требуется GLIBCXX_3.4.15.

И другим двоичным файлам не требуется GLIBCXX_3.4.15, даже если я использую тот же компилятор (g ++ 4.9.3). Они просто хорошо работают.

Как библиотека может заметить, что она должна использовать GLIBCXX_3.4.15?

Отличается ли он исходным кодом?

Компилятор сообщает библиотеке, например, «вам нужно использовать GLIBCXX_3.4.15, потому что вы используете некоторую специальную грамматику в своем коде»?

Я хочу знать, кто определяет, какую версию GLIBCXX использовать для двоичного файла.

1 Ответ

1 голос
/ 19 марта 2019

Это зависит от версии GCC, флагов компилятора и исходного кода.Такие символы, как GLIBCXX_3.4.15, упоминаются только в том случае, если в программе используется определенная функция.Список функций для этой конкретной версии символа довольно большой.Вы можете получить представление о том, какие функции актуальны, используя эту команду (которую вы должны запустить против более новой libstdc ++, то есть той, которая поставляется с GCC 4.9):

$ readelf -sW libstdc++.so.6 | awk '/@GLIBCXX_3.4.15/{print $8}' \
  | sort -u \
  | c++filt

Еслиесли вы хотите запустить вашу программу с неизмененной версией libstdc++.so.6, которая поставляется с Red Hat Enterprise Linux или CentOS, вы можете использовать Developer Toolset (который также доступен в качестве поддерживаемой части Red Hat Enterprise).Linux . Developer Toolset позволяет избежать зависимости от более новых версий символов, используя старый (C ++ 98 эра) C ++ ABI и предоставляя статически связанные копии функций, которые не являются частью системной версии libstdc ++ для конкретной целевой версии операционной системы.

...