这边之前的大多数项目都用的java,而自己用的c++,等到快要上线的时候才发现线上机器的gcc和libc的版本都巨低,跟自己测试开发用的环境不兼容,编译出的c++可执行文件没法运行。解决c++程序的移植问题费了挺大周章,如下是一个具体记录:

1、问题描述

如上所述,线上机器与开发机环境不兼容,需要做c++程序的移植。

2、表现

细节不表,总之就是程序没法运行,找不到对应的库。如下给出几个跟gcc有关的错误提示:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

/lib64/libc.so.6: version `GLIBC_2.7' not found

等等

3、尝试过的方法

在开发机上使用静态编译可以解决大部分问题,例如thrift、cgi、redis等相关库采用静态编译,线上机器就不用装对应软件就可以运行程序。这样,正常的想法是把gcc相关的库也静态编译进可执行文件,那么线上机器就可以直接运行了吧,想法是好的,可惜我们尝试了很长时间,还是以失败告终,线上环境还是不能运行。

4、一定不要做

惨痛教训,一定不要随便动线上机器的libc等环境,尤其不要动内核/lib64/libc.so.6的符号链接(我当时头脑发热,将一些报错的库文件从开发机拷贝到线上机器,然后更改线上机器库文件的符号链接,结果出了很大问题),或者草率升级线上机器的libc(也是教训),这样会造成系统直接down掉,因为内核跟用户态的交互很多都依赖于libc库,升级后与内核不兼容,则会造成基本的ls、sudo等都没法执行。无法进入sudo权限,就无法恢复/lib64下被更改或升级的库文件,只能重启进入急救模式,这对运行有线上服务的机器是很致命的。如果更改了libc.so.6等的软连接或盲目升级libc等,执行基本命令时会报类似如下错误:

error while loading shared libraries: /lib64/libc.so.6: ELF file OS ABI invalid

这是虽然可以通过LD_PRELOAD=/lib64/libc-2.5.so ls 加载旧的libc库,执行一些简单命令,但是sudo却是怎么都进不去的。所以一定提醒大家不要在线上机器上做这种事。

5、最终的解决办法

1)线上机器配置:

可以在用户目录下,建立一个文件夹$dir/Mylib64,为了下面表述方便,$dir表示该文件夹的绝对路径。文件夹下存放开发机中/lib64/文件夹下gcc对应的库文件,例如如下几个:

2)开发机编译选项:

在开发机makefile的g++编译选项最后,添加如下选项用来指定动态库的优先搜索路径和动态链接器:

-Wl,--rpath=$dir/Mylib64 -Wl,--dynamic-linker=$dir/Mylib64/ld-linux-x86-64.so.2

其中$dir就是1)中的绝对路径。

这样开发机make出的可执行文件就可以在线上机器上运行了。

最新文章

  1. SQLServer中Partition By 函数的使用
  2. Android深度探索HAL与驱动开发 第二章 搭建Android开发环境
  3. ASP.NET使用jQuery AJAX实现MD5加密实例
  4. git 最常用命令
  5. Linux版网易云音乐播放音乐时无限显示“网络错误”的解决办法
  6. Linux C学习笔记06--Tlist使用(编程工具篇)
  7. Android开发切换host应用
  8. 【云计算】K8S DaemonSet 每个node上都运行一个pod
  9. 浅谈学习C++时用到的【封装继承多态】三个概念
  10. Javascript实现局部刷新
  11. FZU 2016 summer train I. Approximating a Constant Range 单调队列
  12. 转:android 设计模式合集
  13. hdu 1229 超级大水题
  14. PHP 中 const define 的区别
  15. Baidu Sitemap Generator插件使用图解教程
  16. Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令
  17. 《JavaScript DOM 编程艺术》
  18. 虚拟DOM详解
  19. C#项目获取当前时间的农历时间
  20. python 之 configparser 模块

热门文章

  1. hdu Diophantus of Alexandria(素数的筛选+分解)
  2. shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select
  3. ocp11g培训内部教材_052课堂笔记(042)_体系架构
  4. android 反编译(dex 和 odex),非脑残转帖,绝对可靠
  5. 高效率的Shell
  6. 对[foreach]的浅究到发现[yield]
  7. 【动态规划】leetcode - Maximal Square
  8. jenkins综合cobertura,来电显示cobertura的report
  9. MVC自定义分页
  10. DateTime.ToString("dd/MM/yyyy");后,不能直接Convert.ToDateTime的解决: