旧版GCC不能自动找到新版libstdc++?
Old GCC can not automatically find the new version libstdc++?
我正在尝试将名为 DocToText 的第 3 方库与 gcc 4.4.7 一起使用。
我用以下代码编译程序:
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp
一开始返回libstdc++.so.6: version GLIBCXX_3.4.15 not found
我手动下载了较新的版本,然后重新link下载,结果如下
[root@mail]~xian# find / -name "libstdc++.so.6"
/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6
[root@mail]~xian# strings /lib64/libstdc++.so.6 | grep GLIBCXX_3.4.15
GLIBCXX_3.4.15
[root@mail]~xian# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.15
GLIBCXX_3.4.15
但是我再次编译时,返回:
[root@mail]~xian# g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::swap(std::__detail::_List_node_base&, std::__detail::_List_node_base&)@GLIBCXX_3.4.15'
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)@GLIBCXX_3.4.15'
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::_M_unhook()@GLIBCXX_3.4.15'
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)@GLIBCXX_3.4.15'
collect2: ld returned 1 exit status
我也试过了
g++ -I./doctotext/ -L./doctotext/ -L/lib64/ -Wl,-rpath=./doctotext,-rpath=/lib64 -ldoctotext -lstdc++ -o example test_doctotext.cpp
,我得到了同样的错误(未定义的引用)。
libdoctotext.so确实link到/lib64/libstdc++.so.6
[root@mail]~xian# ldd doctotext/libdoctotext.so | grep libstdc++.so.6
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f96c7ab4000)
幸运的是,我找到了两个方法来解决这个问题:
- 使用更新的 gcc:
我用的是gcc 9.1.1 (with scl),然后
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp
直接可以用。
- 使用 gcc 4.4.7 指定 libstdc++.so.6 的路径:
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext /lib64/libstdc++.so.6 -o example test_doctotext.cpp
但是我很好奇为什么我的gcc 4.4.7不能link到系统默认路径下的那个libstdc++?
libstdc++ 版本是否与 gcc 版本紧密耦合?
============================================= ==================================
最终,我发现 gcc 会使用
[root@mail]/usr/lib64# find / -name "libstdc++.so"
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++.so
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so
[root@mail]/usr/lib64# ll /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so
lrwxrwxrwx. 1 root root 37 Aug 21 15:22 /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so -> ../../../../lib64/libstdc++.so.6.0.13
6.0.13 没有 GLIBCXX_3.4.15
我重新link这个到libstdc++.so.6.0.17,问题解决了
每个 GCC 版本都伴随着它自己的 libstdc++ 版本。
C++ 标准库(以及像 libsupc++ 这样的支持库)通常依赖于编译器中的特定实现细节,包括错误以及由于缺陷报告等导致的特定行为更改。
有时,即使是新的 GCC 版本也需要匹配的 binutils(linker)版本,因为代码的生成方式已更改为使用仅在较新的 linker.[=10= 中可用的特定功能]
您可以通过将该路径传递给 compiler/linker 来显式 link 它到系统 libstdc++,但我不推荐这样做,因为 ABI 可能以不兼容的方式更改。
我正在尝试将名为 DocToText 的第 3 方库与 gcc 4.4.7 一起使用。
我用以下代码编译程序:
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp
一开始返回libstdc++.so.6: version GLIBCXX_3.4.15 not found
我手动下载了较新的版本,然后重新link下载,结果如下
[root@mail]~xian# find / -name "libstdc++.so.6"
/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6
[root@mail]~xian# strings /lib64/libstdc++.so.6 | grep GLIBCXX_3.4.15
GLIBCXX_3.4.15
[root@mail]~xian# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.15
GLIBCXX_3.4.15
但是我再次编译时,返回:
[root@mail]~xian# g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::swap(std::__detail::_List_node_base&, std::__detail::_List_node_base&)@GLIBCXX_3.4.15'
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)@GLIBCXX_3.4.15'
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::_M_unhook()@GLIBCXX_3.4.15'
./doctotext//libdoctotext.so: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)@GLIBCXX_3.4.15'
collect2: ld returned 1 exit status
我也试过了
g++ -I./doctotext/ -L./doctotext/ -L/lib64/ -Wl,-rpath=./doctotext,-rpath=/lib64 -ldoctotext -lstdc++ -o example test_doctotext.cpp
,我得到了同样的错误(未定义的引用)。
libdoctotext.so确实link到/lib64/libstdc++.so.6
[root@mail]~xian# ldd doctotext/libdoctotext.so | grep libstdc++.so.6
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f96c7ab4000)
幸运的是,我找到了两个方法来解决这个问题:
- 使用更新的 gcc:
我用的是gcc 9.1.1 (with scl),然后
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp
直接可以用。 - 使用 gcc 4.4.7 指定 libstdc++.so.6 的路径:
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext /lib64/libstdc++.so.6 -o example test_doctotext.cpp
但是我很好奇为什么我的gcc 4.4.7不能link到系统默认路径下的那个libstdc++?
libstdc++ 版本是否与 gcc 版本紧密耦合?
============================================= ==================================
最终,我发现 gcc 会使用
[root@mail]/usr/lib64# find / -name "libstdc++.so"
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++.so
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so
[root@mail]/usr/lib64# ll /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so
lrwxrwxrwx. 1 root root 37 Aug 21 15:22 /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so -> ../../../../lib64/libstdc++.so.6.0.13
6.0.13 没有 GLIBCXX_3.4.15
我重新link这个到libstdc++.so.6.0.17,问题解决了
每个 GCC 版本都伴随着它自己的 libstdc++ 版本。
C++ 标准库(以及像 libsupc++ 这样的支持库)通常依赖于编译器中的特定实现细节,包括错误以及由于缺陷报告等导致的特定行为更改。 有时,即使是新的 GCC 版本也需要匹配的 binutils(linker)版本,因为代码的生成方式已更改为使用仅在较新的 linker.[=10= 中可用的特定功能]
您可以通过将该路径传递给 compiler/linker 来显式 link 它到系统 libstdc++,但我不推荐这样做,因为 ABI 可能以不兼容的方式更改。