高版本gcc编译的程序在低版本gcc机器上运行

关于linux的程序发布

我们项目的服务器一直使用centos6.5,主要原因是当时各种云服务器厂商的主流稳定centos版本就是6.5,但是这个版本的系统自带的gcc版本是4.4.7,gcc版本过低导致很多gcc新版本的功能无法使用,比如c++11还有之前我介绍过的ASan。 一开始我们自己做了妥协,把编译机从centos7降到了centos6.5,很多c++11的代码也做了修改。 编译机和线上环境系统版本的统一保证了程序的稳定性。

但是随着项目的发展,一些gcc的新功能也确实特别诱人,为了升级gcc研究了一下这个问题。 其实只要把编译机上的libstdc++.so文件与我们自己的程序一起发布就可以了,编译机上可以升级gcc到最新版本,程序编译发布时将升级过的libstdc++.so文件一同发布,让我们自己的程序在运行的时候动态链接编译机上的libstdc++.so(使用g++的-Wl,-rpath命令)

好像是gcc的某一个版本之前libstc++.so是依赖于libc.so的,也就是说当时如果只发布libstc++.so可能程序也跑不起来,之后某个版本又解除了这个依赖,不知道我说的对不对。。。记录一下。

顺便记录几个命令

查看libstdc++.so的版本

strings /usr/lib/libstdc++.so.6 | grep GLIBCXX  

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH


查找系统的全部名字是libstdc++.so.6的文件
find / -name "libstdc++.so.6"

/data/service/share_server_trunk/commonlib/libstdc++.so.6
/usr/lib64/libstdc++.so.6