/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?