老的GCC不能自动找到新版本的libstdc++吗?

agxfikkp  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(193)

我尝试使用第三方库,称为DocToText,与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
我手动下载了更新的版本,并重新链接,这是结果

[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 indeed link to /lib64/libstdc++.so.6

[root@mail]~xian# ldd doctotext/libdoctotext.so | grep libstdc++.so.6
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f96c7ab4000)

幸运的是,我找到了两个解决这个问题的方法:
1.使用更新的gcc:我使用了gcc 9.1.1(带scl),然后g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp直接工作。
1.使用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不能链接到系统默认路径下的那个libstdc ++?
libstdc ++版本是否以某种方式与gcc版本紧密耦合?

vjhs03f7

vjhs03f71#

每个GCC发行版都有自己的libstdc发行版。
C
标准库(以及像libsupc这样的支持库)通常依赖于编译器中特定的实现细节,包括bug,以及由于缺陷报告而导致的特定行为变化等。有时候,即使是新的GCC版本也需要一个匹配的binutils(链接器)版本,因为代码生成的方式改变为使用只有新链接器才提供的特定功能。
您可以通过将该路径传递给编译器/链接器来显式地将其链接到系统libstdc
,但我不推荐这样做,因为ABI可能以不兼容的方式进行了更改。

sycxhyv7

sycxhyv72#

最后,我发现海湾合作委员会

[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
我将它重新链接到libstdc++.so.6.0.17,问题解决了
OP最初编辑到问题中的答案,参见the revision history

相关问题