/lib64/libstdc++.so.6: версия `CXXABI_1.3.8' не найдена (требуется ./libQt3Something.so.4)

После обновления нашего подчиненного устройства сборки Jenkins с Debian 8 (с использованием g++ 4.9.2) до Debian 9 (с использованием g++ 6.3.0) наше приложение на основе Qt 4.8.7, которое ранее отлично работало в Red Hat Enterprise Linux 7.2 (RHEL7.2), теперь не работает с ошибкой

      [treality@redhatvbox bin]$ ./MyApplication
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./libQt3Support.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQt3Support.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQtSql.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQtXml.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./libQtOpenGL.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQtOpenGL.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./libQtGui.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQtGui.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./libQtNetwork.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQtNetwork.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./libQtCore.so.4)
./MyApplication: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./libQtCore.so.4)

Обратите внимание, что мы также собираем Qt 4.8.7 из исходного кода.

Насколько я понимаю, это связано с тем, что наше приложение теперь построено на Debian 9 с использованием версии 6.3.0 g++ и libstdc++, а в RHEL7.2 установлена ​​libstdc++ 4.8.5:

      $ yum info libstdc++
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
Name        : libstdc++
Arch        : x86_64
Version     : 4.8.5
Release     : 4.el7
Size        : 1.0 M
Repo        : installed
From repo   : anaconda
Summary     : GNU Standard C++ Library
URL         : http://gcc.gnu.org
License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description : The libstdc++ package contains a rewritten standard compliant GCC Standard
            : C++ Library.

который имеет следующие версии:

      $ strings /lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_TM_1

В Debian 8 у нас есть аналогичные версии для in (только одна дополнительная CXXABI_1.3.8):

      $ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_TM_1

но в Debian 9, в /usr/lib/x86_64-linux-gnu/libstdc++.so.6в CXXABIвидимо тоже требует CXXABI_1.3.9, CXXABI_1.3.10а также CXXABI_FLOAT128:

      $ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_1.3.9
CXXABI_1.3.10
CXXABI_TM_1
CXXABI_FLOAT128

В прошлом мы могли решить аналогичную проблему, используя -static-libstdc++флаг компоновщика при связывании нашего приложения с g++. Однако, насколько я понимаю, в настоящее время мы снова используем тот же самый флаг компоновщика при компоновке всех файлов .o в наше основное приложение. Команда ссылки начинается с:

      g++ -Wl,--rpath . -ldl -static-libstdc++  ... and other stuff ...

Так что я немного в темноте, почему это не работает. Может ли проблема заключаться в том, что в настоящее время мы действительно статически компонуем libstdc++, когда компилируем наше приложение, но этого не произошло, когда мы компилировали Qt 4.8.7 из исходного кода? Я думаю в правильном направлении, если я думаю, что нам также нужно статически связывать libstdc++ при компиляции Qt 4.8.7 из исходного кода?

Таким образом, главный вопрос: что мы можем сделать, чтобы наше приложение Qt 4.8.7, которое мы в настоящее время собираем на Debian 9, также работало на более старой системе Red Hat Enterprise Linux 7.2?

0 ответов

Другие вопросы по тегам