linux不同环境下c/c++程序移植方法
这边之前的大多数项目都用的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++程序移植方法的更多相关文章
- 如何在Linux桌面环境下自动启动程序?
大多数Linux桌面环境有各自的图形用户界面(GUI),让用户可以配置针对特定用户的自动启动程序或服务.本文将介绍如何在各种Linux桌面环境下,自动启动某个程序的方法. AD:WOT2014:用户标 ...
- 嵌入式linux应用程序移植方法总结
嵌入式linux应用程序移植方法总结 前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下openCapwap移植过程中的经验和感悟.江浩 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(二)
linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(二) 安装apache web容器 . yum方式安装apache 注意apache在linux ...
- 在linux命令行下执行php 程序
如何在linux命令行下,执行php程序. 例子 打印当前时间 php -r "echo time()" 随机输出一个数字 php -r "echo rand(1,20) ...
- 在 Windows 和 Linux(Gnome) 环境下 从命令界面打开网页的方式
1.在 Windows 中 通过命令 可以打开网页是很简单的: start http://www.baidu.com 或 start iexplorer http://www.baidu.com 第二 ...
- Linux centos7环境下安装JDK的步骤详解
Linux centos7环境下安装JDK的步骤详解 测试root用户下JAVA版本 输入命令: java –version 1.先到Oracle官网里下载好jdk,网址如下: http://ww ...
- Linux centos7环境下安装MySQL的步骤详解
Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...
- Linux centos7环境下安装Nginx
Linux centos7环境下安装Nginx的步骤详解 1. 首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...
随机推荐
- hdu Color the ball
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 树状数组的 update的应用,逆序更新 代码: #include <stdio.h&g ...
- 实战parse_ini_file()及扩展函数解析ini文件完整版
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/587 在PHP站点开发的过程中,往往会用到读取ini參数配置文件,比方须要訪问一些复杂的借 ...
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源代码)
,400],[200,5],[100,77],[40,300]]) shape:显示(行,列)例:shape(group)=(4,2) zeros:列出一个同样格式的空矩阵,例:zeros(group ...
- 使用DPM(Deformable Part Model,voc-release3.1)算法INRIA通过训练你的身体检测模型数据集
我的环境 DPM源代码版本号:voc-release3.1 VOC开发包版本号:VOC2007_devkit_08-Jun Matlab版本号:MatlabR2012b c++编译器:VS2010 系 ...
- Ajax得知(两)—— 一个简单的Ajax示例
通过部分博客认识Ajax之后,我们通过一个简单的实例来消化消化理论知识,一睹Ajax的庐山真面目. 1.实例功能: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...
- 代理模式与Android
代理模式(Proxy) 一. 什么是代理模式 先来看看官方的说法,代理模式就是为其它对象提供一种代理,以控制对这个对象的訪问. 看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不 ...
- JavaScript超大整数加法
原文:JavaScript超大整数加法 什么是「超大整数」? JavaScript 采用 IEEE754标准 中的浮点数算法来表示数字 Number. 我也没花时间去详细了解 IEEE754标准 ,但 ...
- Net Framework中的提供的常用委托类型
.Net Framework中的提供的常用委托类型 .Net Framework中提供有一些常用的预定义委托:Action.Func.Predicate.用到委托的时候建议尽量使用这些委托类型,而 ...
- ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。
提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.
- PHP 5:PHP语法导向
原文:PHP 5:PHP语法导向 代码 ...