2010-01-18 80 views
24

的安装新构建机器之后,我发现它来与C++标准库链接使用较早版本的libstdC++

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

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

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

显然,ABI在最后两0.0.1的改变,如试图在

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found 
运行程序结果

我试着明确安装一个旧版本的gcc,但没有帮助。 升级目标机器超出了我的控制范围,所以不是一个选项。让我的构建能够在具有较旧libstdC++的机器上工作的最佳方式是什么?

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

回答

18

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

看一看the GNU ABI policy。 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中取出它),以及开始挖掘。为我工作。

+0

你的意思是我们必须安装一个旧版本的g ++吗? – 2011-07-08 03:49:51

+0

@Peter是的,拿G ++链接到旧版本的libstdC++的旧版本。所以 – Jan 2011-07-08 11:50:44

+10

我觉得这是很蹩脚的,为了使用C++库的旧版本,你不得不忍受这可能有缺陷,编译器和失踪优化 - 尤其是因为其他方式轮(使用旧的编译器,一个新版本的库)似乎只是一个设定'LD_LIBRARY_PATH'的问题。 – 2013-09-25 12:42:02

6

您可以使用您自己的代码(例如,在一个子目录中)发布所需的共享库,并将LD_LIBRARY_PATH作为运行应用程序的先驱,以首先在该目录中进行搜索。

运送您需要的特定版本将意味着用户安装的版本无关紧要。你只需要确保你发布了所有的依赖关系。

1

已经遇到过这个。我没有想到使用与目标机器相同的配置安装系统(虚拟化?)来构建可分发的二进制文件。

+1

,而这肯定是一种选择,这似乎这么多的工作简单地用旧的库链接......我希望有更好的选择将被张贴说实话:) – Pieter 2010-01-18 11:25:04

+0

另外一个选择是安装的版本完全相同目标系统上存在的stdC++库。但是,由于它在发行版中默认不存在,所以您必须手动完成。这不会是微不足道的,而且会让你的系统中共存的2版本真正令人头痛。设置旧的发行和编译它是一两个小时(如果你不使用,很多异国库),并与图书馆设置的手动第二个版本是真的值得。 – 2010-01-18 14:10:48

+0

你不需要安装一个完整的系统 - 刚刚成立的第二个工具链,如果你是交叉编译,而是针对自己的平台。 – ephemient 2010-01-18 19:33:32

1

替代方法不适用于我,但也许别人会发现它很有用,它是静态链接libgcc和libstdC++。

gcc有一个选项-static-libgcc,但是简单地使用这个选项并没有实现,因为libstdC++仍然是动态链接的。但通过确保gcc只能找到静态版本的libstdC++,就可以实现静态链接。

ln -s `g++ -print-file-name=libstdc++.a` 
g++ -static-libgcc -L. source.cpp 

问题是,Boost库建成对新的libstdC++,所以在程序编译正确,它会生成运行时错误...

也许这是可以解决的,如果我重新提振也避风港” t试过了。

(备案,如果你使用的动态加载库中的任何代码,通过例如dlopen,静态链接是一切无从谈起)

+0

你只需要使用-static-libstdC++并且不需要符号链接魔术。 – Kaa 2017-12-29 00:44:13

2

您可以“走私”的新的libstdC++到客户端系统(成一个私人区域),并将程序与适当的-rpath链接,或者您可以将旧版本的libstdC++加载到您的计算机上。它看起来不像你需要的更新,无论如何,这可能是其他原因。

注意:在FreeBSD上,libstdC++与编译器(我安装了gcc4.2,4.4和4.5,每个都有自己的libstC++)结合在一起。尝试安装一个较旧的(与客户端系统匹配的)版本的gcc,它可能会携带您正在寻找的较旧的libstdC++。

0

你有没有尝试过把它与源列表放在一起?这假定你实际上已经安装了库!

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp 
+0

libstdC++不能以这种方式包含。有一个static-libC++选项,但它通常不是你想要的。 – phord 2012-02-23 22:26:12

相关问题