微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

旧版GCC无法自动找到新版本libstdc ++?

如何解决旧版GCC无法自动找到新版本libstdc ++?

我正在尝试将名为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 / 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直接可用。
  2. 使用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的版本紧密相关?

================================================ ===============================

最终,我发现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

我将其重新链接到libstdc ++。so.6.0.17,问题已解决

解决方法

每个GCC版本都有其自己的libstdc ++版本。

C ++标准库(以及诸如libsupc ++之类的支持库)通常依赖于编译器中的特定实现细节,包括错误以及由于缺陷报告等导致的特定行为更改。 有时,甚至新的GCC版本也需要匹配的binutils(链接器)版本,因为生成代码的方式已更改为使用仅在较新的链接器中可用的特定功能。

您可以通过将该路径传递给编译器/链接器来将其显式链接到系统libstdc ++,但是我不建议这样做,因为ABI可能以不兼容的方式进行了更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?