安装新的构建机器后,我发现它带有6.0.10的标准C ++库
-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
显然ABI在最后两个0.0.1中发生了变化,因为尝试运行程序导致
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
我尝试明确安装旧版本的gcc,但这没有帮助。 升级目标计算机是我无法控制的,所以不能选择。让我的构建在具有较旧libstdc ++的机器上工作的最佳方法是什么?
我在apt-cache中搜索了要安装的较旧libstdc ++版本,但显然没有旧版本的6可用吗?
答案 0 :(得分:20)
您不需要链接到其他库,您需要使用旧版本的编译器。
看看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中取出),然后启动挖掘。为我工作。
答案 1 :(得分:7)
您可以使用自己的代码(例如,在子目录中)发送所需的共享库,并将LD_LIBRARY_PATH设置为运行应用程序的前身,以便首先在该目录中进行搜索。
运送您需要的特定版本意味着用户安装的版本无关紧要。您只需确保同时发送所有依赖项。
答案 2 :(得分:2)
已经遇到过这个。我没想到比使用与目标机器相同的配置安装系统(虚拟化?)来构建可分发的二进制文件更好。
答案 3 :(得分:1)
Al替代方案,对我来说不起作用,但也许其他人会觉得它很有用,就是静态链接libgcc和libstdc ++。
gcc有一个选项-static-libgcc
,但只是使用此选项无法实现,因为libstdc ++仍然是动态链接的。但是通过确保gcc只能找到libstdc ++的静态版本,可以实现静态链接。
ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp
问题是,boost库是针对较新的libstdc ++构建的,所以当程序正确编译时,会产生运行时错误......
如果我重建提升,也许这是可以解决的,没有尝试过。
(对于记录,如果您使用任何动态加载库的代码,例如dlopen
,静态链接都是不可能的)
答案 4 :(得分:1)
您可以将较新的libstdc ++“偷偷”入客户端系统(进入私有区域)并使用适当的-rpath
链接程序,也可以将旧版本的libstdc ++导入您的计算机。它看起来不像你需要更新,无论如何它可能因其他原因而无法解决。
注意:在FreeBSD上,libstdc ++与编译器耦合(我安装了gcc4.2,4.4和4.5,每个都有自己的libstc ++)。尝试安装较旧的(匹配客户端系统)版本的gcc,它可能会带有你正在寻找的旧的libstdc ++。
答案 5 :(得分:0)
您是否尝试过将其放入源列表中?这假设您实际安装了库!
g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp
答案 6 :(得分:0)
为我工作:设置此标志:
-Wl,-静态-lstdc ++ -Wl,-Bdynamic -Wl,-静态-lgcc -Wl,-Bdynamic -静态
如果只放-static-libstdc ++ -static对我不起作用。