目录
3.1 方式1 在编译时设置rpath和dynamic linker
3.2 方式2 直接修改二进制程序的rpath和interpreter
比如我们用gcc 9.3.0编译程序,但需要发布的机器gcc版本是4.8.5,怎么办?
你可能想到如下方法
- 静态编译
- 容器发布
- 打包依赖的so,使用本地so运行程序
1.静态编译(多数场景不行)
其中静态编译是行不通的,libstdc++是可以静态编译,但是libc没有提供这方面的功能,即使你是cpp程序,依然会大概率依赖libc.so
可以通过nm <bin> | grep GLIBC_
确定你的程序是否依赖了glibc,没有的话,你可以考虑直接静态编译libstdc++。
2.容器发布(部分场景可以使用)
使用携带gcc9.3.0环境的容器发布程序,是可以的。但是在一些没有容器且没有sudo权限的场合,依然不太友好。
3.安装部署devtoolset
从源码安装的难度不低,向了devtoolset可能是不错的选择
RedHat 推出Software Collections
的目的就是为了解决想在RedHat
系统下能使用新版本的工具,让同一个工具(如gcc)的不同版本能在系统中共存,在需要的时候切换到对应的版本中
如何安装和使用devtoolset
,可以参考官方指导文档。在看装前,我们可以先到Information for build搜索自己需要的package对应的源码版本,看devtoolset
中的安装包对应的源码版本是多少,是否满足自身的需求。