这边之前的大多数项目都用的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出的可执行文件就可以在线上机器上运行了。

linux不同环境下c/c++程序移植方法的更多相关文章

  1. 如何在Linux桌面环境下自动启动程序?

    大多数Linux桌面环境有各自的图形用户界面(GUI),让用户可以配置针对特定用户的自动启动程序或服务.本文将介绍如何在各种Linux桌面环境下,自动启动某个程序的方法. AD:WOT2014:用户标 ...

  2. 嵌入式linux应用程序移植方法总结

    嵌入式linux应用程序移植方法总结 前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下openCapwap移植过程中的经验和感悟.江浩 ...

  3. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  4. linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(二)

    linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(二) 安装apache web容器 . yum方式安装apache 注意apache在linux ...

  5. 在linux命令行下执行php 程序

    如何在linux命令行下,执行php程序. 例子 打印当前时间 php -r "echo time()" 随机输出一个数字 php -r "echo rand(1,20) ...

  6. 在 Windows 和 Linux(Gnome) 环境下 从命令界面打开网页的方式

    1.在 Windows 中 通过命令 可以打开网页是很简单的: start http://www.baidu.com 或 start iexplorer http://www.baidu.com 第二 ...

  7. Linux centos7环境下安装JDK的步骤详解

    Linux centos7环境下安装JDK的步骤详解 测试root用户下JAVA版本 输入命令:   java –version 1.先到Oracle官网里下载好jdk,网址如下: http://ww ...

  8. Linux centos7环境下安装MySQL的步骤详解

    Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...

  9. Linux centos7环境下安装Nginx

    Linux centos7环境下安装Nginx的步骤详解 1.    首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...

随机推荐

  1. Tyvj P1016 包装问题 (DP)

    底 Background 太原诚成中学2模拟法庭竞赛 第三条道路 描写叙述 Description 有一个箱子容量为v(正整数.o≤v≤20000).同一时候有n个物品(o≤n≤30).每一个物品有一 ...

  2. POJ3468 A Simple Problem with Integers 【段树】+【成段更新】

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 57666   ...

  3. 两个容易被忽略的mysql知识

    原文:两个容易被忽略的mysql知识 为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql ...

  4. PLSQL_监控有些SQL的执行次数和频率

    原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建

  5. iOS开发之在地图上绘制出你运行的轨迹

    首先我们看下如何在地图上绘制曲线.在Map Kit中提供了一个叫MKPolyline的类,我们可以利用它来绘制曲线,先看个简单的例子. 使用下面代码从一个文件中读取出经纬度,然后创建一个路径:MKPo ...

  6. SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...

  7. 非常多人不愿意承认汉澳sinox已经超过windows

    汉澳sinox採用的zfs和jail打造高可靠性存储server和矩阵计算机,这不是windows和linux能相提并论的. 只是非常多人立即出来出来反驳说,windows驱动程序多(就是支持硬件多) ...

  8. 使用Row_Number()分页优化

    记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题   最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且 ...

  9. 快速构建Windows 8风格应用5-ListView数据控件

    原文:快速构建Windows 8风格应用5-ListView数据控件 本篇博文主要介绍什么是ListView数据控件.如何构建ListView数据控件. 什么是ListView数据控件? 1)  Li ...

  10. Linux:最终用途cat命令查看不可见的字符

    常,的程序或软件,并没有语法错误,你检查其内容没有发现相关问题.这是时间,因为你用普通的文本编辑软件来查看,有很多的字符显示不出来的,但在最终用途cat命令可以很easy地检測出是否存在这些字符. ~ ...