devtoolset-6 использует системный libstdc++ и не может связать

У меня есть сторонняя библиотека, скомпилированная с помощью gcc6, с которой мне нужно связать. Поэтому я удалил стандартные пакеты GCC и установил пакет Software Collections devtoolset-6 (Centos 7.4).

$ g++ -v

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-6/root/usr --mandir=/opt/rh/devtoolset-6/root/usr/share/man --infodir=/opt/rh/devtoolset-6/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl=/builddir/build/BUILD/gcc-6.3.1-20170216/obj-x86_64-redhat-linux/isl-install --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC)

Однако я получаю много ошибок ссылок, подобных этому:

libcomsd.so: undefined reference to `operator delete[](void*, unsigned long)@CXXABI_1.3.9'

Похоже, это связано с тем, что devtoolset не поставляется с версией libstd++, скомпилированной с новым компилятором, поэтому компоновщик находит стандартную версию в /usr/lib64, которая скомпилирована с помощью gcc4, и, следовательно, несовместима с бинарным кодом libcomsd, который скомпилирован. с gcc6.

Есть ли способ заставить все это работать? Какой-то пакет libstd++, скомпилированный с помощью gcc6?


person Greg    schedule 06.06.2018    source источник
comment
Все компиляторы devtoolset построены на старой версии libstd++. Предложите: установите gcc63-c++-6.3.0-1.el7.x86_64.rpm stackoverflow.com/questions/47175706/ ... поставляется с /usr/local/gcc63/lib64/libstdc++.so -> libstdc++.so.6.0.22   -  person Knud Larsen    schedule 06.06.2018
comment
@KnudLarsen, это неточно. devtoolset-6-gcc-c++ установит devtoolset-6-libstdc++-devel, соответствующий libstdc++ для GCC 6.3.1, но он предоставляет только статическую библиотеку, содержащую символы, которых нет в более старой системе libstdc++. Проблема здесь в том, что для сторонней библиотеки требуется новая libstdc++ в качестве разделяемой библиотеки, потому что она не была собрана с помощью компилятора devtoolset.   -  person Jonathan Wakely    schedule 07.06.2018
comment
@ Грег, нет необходимости удалять стандартные пакеты GCC для установки devtoolset.   -  person Jonathan Wakely    schedule 07.06.2018
comment
Спасибо за ваши комментарии. На данный момент я получил версию libstd++.so из того же источника, что и другая библиотека, и поместил ее в тот же каталог и связал с -rpath, чтобы exe ее нашел.   -  person Greg    schedule 08.06.2018
comment
И тысяча проклятий разработчикам, которые думают, что знают лучше, чем сопровождающие, и решают упаковать свои собственные инструменты разработчика.   -  person Greg    schedule 08.06.2018
comment
В качестве дальнейшего продолжения у меня есть доступные библиотеки .a, поэтому я попробовал статическое связывание (что нормально, потому что среда развертывания будет контейнером Docker и, следовательно, не требует дополнительных затрат на статику). Это почти сработало, но не удалось, потому что один из сторонних файлов .a использует Lua и содержит неразрешенную ссылку на (lua_dyn.cpp.o): undefined reference to symbol 'dlsym@@GLIBC_2.2.5'.   -  person Greg    schedule 12.06.2018


Ответы (1)


devtoolset-9 решил проблему отсутствия динамического so library.
Абсолютный путь следующий:

/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so

person mariolu    schedule 20.04.2021