我正在尝试使用名为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确实链接到/lib64 64/libstdc++.so.6。
[root@mail]~xian# ldd doctotext/libdoctotext.so | grep libstdc++.so.6
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f96c7ab4000)幸运的是,我找到了解决这个问题的两种方法:
works.
g++ -I./doctotext/ -L./doctotext/ -Wl,-rpath=./doctotext -ldoctotext -o example test_doctotext.cpp直接使用 4.4.7: libstdc++.so.6到libstdc++.so.6的路径但是我真的很好奇为什么我的gcc 4.4.7不能在系统默认路径下链接到那个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.136.0.13没有GLIBCXX_3.4.15
我把这个链接到libstdc++.so.6.0.17,问题解决了
发布于 2020-11-10 09:41:49
每个GCC版本都伴随着它自己的libstdc++版本。
C++标准库(以及像libsupc++这样的支持库)通常依赖于编译器中的特定实现细节,包括bug,以及缺陷报告等导致的行为的特定变化。有时,即使是新的GCC版本也需要一个匹配的二进制文件(链接器)版本,因为代码生成的方式被更改为使用仅在新链接器中可用的特定功能。
通过将该路径传递给编译器/链接器,您可以显式地将其链接到系统libstdc++,但我不建议这样做,因为ABI可能以一种不兼容的方式改变了。
https://stackoverflow.com/questions/64766212
复制相似问题