当前位置: 首页 > 面试题库 >

链接到旧版本的libstdc ++

汪思博
2023-03-14
问题内容

安装新的构建机器后,我发现它带有标准C ++库的6.0.10

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10

但是,我们的许多目标计算机仍使用旧版本的libstdc ++,例如:

-rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8

显然,在最后两个0.0.1中,ABI发生了变化,因为尝试运行程序会导致

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

我尝试明确安装旧版本的gcc,但没有帮助。升级目标计算机是我无法控制的,因此不是一种选择。使我的构建在具有较旧libstdc
++的计算机上工作的最佳方法是什么?

我在apt-cache中搜索了要安装的旧libstdc ++版本,但显然没有6的旧版本可用吗?


问题答案:

您不需要链接到其他库,您需要使用较旧版本的编译器。

看看GNU ABI政策。libstdc
++共享库旨在向前兼容。即如果需要6.0.8,则可以使用版本6.0.10。在该策略中,您可以从gcc-4.2.0开始阅读,需要6.0.9,因此您需要一个gcc-4.1.x。

简而言之,这就是为什么您的系统上只有一个libstdc ++。so.6.0.x的原因,您只需要最新的即可。

至于将构建系统设置为仅使用特定版本的编译器:确保不能使用标准g ++(重命名链接,删除提供它的软件包,将其从PATH中取出),然后开始进行挖掘。为我工作。



 类似资料:
  • 问题内容: 在x86_64 linux上使用gcc和ld我需要链接到库的新版本(glibc 2.14),但是可执行文件需要在具有旧版本(2.5)的系统上运行。由于唯一不兼容的符号是memcpy(需要memcpy@GLIBC_2.2.5,但提供memcpy@GLIBC_2.14的库),我想告诉链接器,它应该使用我指定的旧版本,而不是使用memcpy的默认版本。 。 我发现这样做很尴尬:只需在链接器命

  • 问题内容: 当我在Ubuntu Lucid 10.04 PC上编译东西时,它会与glibc链接。Lucid使用glibc 2.11。当我在具有旧版glibc的另一台PC上运行此二进制文件时,该命令失败,提示没有glibc 2.11 … 据我所知,glibc使用符号版本控制。我可以强制gcc链接到特定的符号版本吗? 在我的具体用法中,我尝试为ARM编译gcc跨工具链。 问题答案: 您是正确的,因为g

  • 问题内容: 我有一个与第三方供应商VENDOR1的库X版本libfoo静态链接的应用程序。它还与来自第三方供应商VENDOR2的动态(共享)库libbar链接,该库静态链接了VENDOR1的libfoo版本Y。 因此libbar.so包含libfoo.a的Y版本,而我的可执行文件包含libfoo.x的X版本。libbar仅在内部使用libfoo,并且没有从我的应用程序传递到libbar的libfo

  • 问题内容: Linux二进制文件通常动态链接到核心系统库(libc)。这样可以使二进制文件的内存占用空间很小,但是依赖于最新库的二进制文件将无法在较旧的系统上运行。相反,链接到较早的库的二进制文件将在最新的系统上愉快地运行。 因此,为了确保我们的应用程序在分发期间具有良好的覆盖范围,我们需要找出我们可以支持的最旧的libc并将其链接到该二进制文件。 我们应该如何确定可以链接到的最旧版本的libc?

  • 和用户余额相关的信息,余额单位都是按照 CNY 的「分」作为单位。 接口不给现实数字,而是给出以 CNY 的「分」单位的数字,并在「启动者」中提供了显示转换比例,单位为百分比(%) 钱包信息 钱包信息提供进入钱包页面所需的附加信息记录接口。 在未来开发中,一些信息可能会被移动到「启动者」中。 GET /wallet 响应 Status: 200 OK { "labels":[ // 充值选

  • 问题内容: 我通过终端更新 sklearn 版本 如果我列出 但是如果我在笔记本上运行 结果是 如何解决和更新Jupyter Notebook中的版本? 问题答案: 要更新Jupyter使用的版本,您需要通过Jupiter界面打开终端 并从这里运行命令 错误是使用系统终端。