在安装新的机器之后,我发现它带有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中search了较旧的libstdc ++版本来安装,但显然没有旧版本的6可用?
您不需要链接到不同的库,您需要使用较旧版本的编译器。
看看GNU ABI策略 。 libstdc ++共享库被设计为向前兼容。 即6.0.0版本可以使用,如果你需要6.0.8。 在策略中,你可以从gcc-4.2.0开始读取,需要6.0.9,所以你需要一个gcc-4.1.x。
总之,这就是为什么在你的系统上只有一个libstdc ++。so.6.0.x,你只需要最新的。
至于设置你的编译系统只使用特定版本的编译器:确保不能使用标准的g ++(重命名链接,删除提供的包,从PATH中取出),然后开始挖掘。 为我工作。
您可以使用您自己的代码(例如,在一个子目录中)发布所需的共享库,并将LD_LIBRARY_PATH作为运行应用程序的先驱,首先在该目录中进行搜索。
运送您需要的特定版本将意味着用户安装的版本无关紧要。 你只需要确保你运送所有的依赖关系。
您可以将较新的libstdc ++“走私”到客户端系统(进入专用区域),并将这些程序与适当的-rpath
链接起来,也可以在您的计算机上安装旧版本的libstdc ++。 它看起来并不需要更新,反正其他原因也可能不成问题。
注意:在FreeBSD上,libstdc ++与编译器(我已经安装了gcc4.2,4.4和4.5,每个都有自己的libstc ++)。 尝试安装一个较旧的(匹配客户端系统)版本的gcc,它可能会携带您正在寻找的较旧的libstdc ++。
已经遇到过这个。 我没有想到比使用与目标机器相同的配置安装系统(虚拟化?)来构建可分发的二进制文件更好。
替代方案,这不适合我,但也许别人会发现它是有用的,是静态链接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
,静态链接都是dlopen
的)
你有没有试过把它与源的名单? 这假设你实际上已经安装了库!
g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp