链接旧版本的libstdc ++

Pie*_*ter 28 c++ linux linker

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

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10
Run Code Online (Sandbox Code Playgroud)

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

-rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8
Run Code Online (Sandbox Code Playgroud)

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

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
Run Code Online (Sandbox Code Playgroud)

我尝试显式安装旧版本的gcc,但没有帮助.升级目标计算机是我无法控制的,所以不能选择.使用较旧的libstdc ++的机器上运行构建的最佳方法是什么?

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

Jan*_*Jan 20

您不需要链接到不同的库,您需要使用旧版本的编译器.

看看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中取出),然后开始挖掘.为我工作.

  • 我认为,为了使用旧版本的C++库,您必须使用可能存在错误和缺少优化的编译器,这一点非常蹩脚 - 特别是因为出现了另一种方式(使用带有新库版本的旧编译器)只是设置`LD_LIBRARY_PATH`的问题. (15认同)

pax*_*blo 7

您可以使用自己的代码(例如,在子目录中)发送所需的共享库,并将LD_LIBRARY_PATH设置为运行应用程序的前身,以便首先在该目录中进行搜索.

运送您需要的特定版本意味着用户安装的版本无关紧要.您只需确保同时发送所有依赖项.