• 7580阅读
  • 10回复

[提问]linux程序发布提示GLIBC_2.9 not found [复制链接]

上一主题 下一主题
离线wujianhui
 

只看楼主 正序阅读 楼主  发表于: 2014-07-17
大家好,我在RHEL6.4-x86_64上用Qt4.8.4编译了一个程序,并发布到RHEL5.9-x86_64系统上,提示“ /lib64/libc.so.6:version 'GLIBC_2.9' not found' required by ./libQtCore.so.4”。
请问改如何解决这个问题
目标机属于别家公司的服务器,已经在运行,不允许安装文件。我安装一套RHEL5.9的系统,用此系统发布的程序是不是也是这样???
我是想如果动态发布不行,静态发布可否???
谢谢各位大大了。
离线wujianhui

只看该作者 10楼 发表于: 2014-07-21
回 adonais 的帖子
adonais:在目标机器上升级glibc,客户不同意就只能使用第二种方法.
在RHEL5.9上自行编译Qt4.8.4,然后编译你自己的程序,打包程序与依赖库(qt4 library),然后发送给客户.
打包是个关键,这里与windows程序不同,最好不要复制依赖库到当前程序所在路径,因为linux下的程序运行不会在当前目录 .. (2014-07-20 15:24) 

我已经将我的程序改成Qt3版本了,但是还是要谢谢你。
有空可以试试你说的glibc编译的方式,以后用到的可能性很大哦
离线adonais

只看该作者 9楼 发表于: 2014-07-20
回 wujianhui 的帖子
wujianhui:你的意思是安装一台RHEL5.9系统,在新系统上升级glibc。
然后编译Qt和应用程序,采用动态发布,这样就能够在没有环境的LINUX系统上运行?
那为什么我RHEL6.4不能发布的不能运行呢???
还是要在目标机器上升级glibc,才能运行???如果是在目标机器上升级,客户不同意的。
....... (2014-07-17 22:19)

在目标机器上升级glibc,客户不同意就只能使用第二种方法.
在RHEL5.9上自行编译Qt4.8.4,然后编译你自己的程序,打包程序与依赖库(qt4 library),然后发送给客户.

打包是个关键,这里与windows程序不同,最好不要复制依赖库到当前程序所在路径,因为linux下的程序运行不会在当前目录查找.so这些动态库路径,除非你使用启动脚本修改LD_LIBRARY_PATH环境变量.

比较好的方法是这样子:
比如说你把qt4安装在/opt/qt4目录,编译你自己程序的时候使用链接参数-rpath=/opt/qt4/lib.发布程序的时候把libQtCore.so这些依赖库文件复制到目标机器的/opt/qt4/lib目录就可以了.

对于glibc版本过低问题,其实有个一劳永逸的解决方法,就是比较麻烦:
你可以在任何linux机器上重新编译一个低版本的gblic,安装到某个路径,比如/opt/dev_build/glibc2.9
然后重新编译binutils,gcc 编译的时候指定rpath为/opt/dev_build/glibc2.9/lib
以后你就可以用自己编译的gcc编译任何程序了,只要加上-rpath=/opt/dev_build/glibc2.9/lib参数.
发布程序的时候如果目标机器存在glibc过低问题,要把libc.so.6复制到目标机器的/opt/dev_build/glibc2.9/lib目录即可.

5条评分好评度+1贡献值+1金钱+6威望+1
a731062834 金钱 +1 - 2021-04-13
wujianhui 好评度 +1 优秀文章,支持!n神马都是浮云 2014-07-21
wujianhui 贡献值 +1 优秀文章,支持!n神马都是浮云 2014-07-21
wujianhui 威望 +1 优秀文章,支持!n神马都是浮云 2014-07-21
wujianhui 金钱 +5 优秀文章,支持!n神马都是浮云 2014-07-21
离线wujianhui

只看该作者 8楼 发表于: 2014-07-18
回 wujianhui 的帖子
wujianhui:寒夜行人:
1.自己安装一台rhel系统试试,看运行效果
2.把缺少的动态库放到程序运行的当前目录中
3.写脚本启动程序,先写当前路径添加到系统库路径中的命令,在写启动你的程序的命令
这样就不会有缺少库一说,也不用安装新的软件
....... (2014-07-17 22:12) 

系统已经进入了。开机时按e,弹出选择kernel 那行,再按e编辑。输入linux single,回车完成编辑。
之后按b启动就可以进入单用户模式,就可以删除libc.so.6了,再重启成功进入系统。
离线wujianhui

只看该作者 7楼 发表于: 2014-07-17
回 adonais 的帖子
adonais:别乱回答,误导人家.
真正的问题是RHEL5.9系统上的glibc版本过低,静态发布也不可行.
解决问题的方法:
1)升级RHEL5.9上的glibc.
....... (2014-07-17 20:13) 

你的意思是安装一台RHEL5.9系统,在新系统上升级glibc。
然后编译Qt和应用程序,采用动态发布,这样就能够在没有环境的LINUX系统上运行?
那为什么我RHEL6.4不能发布的不能运行呢???
还是要在目标机器上升级glibc,才能运行???如果是在目标机器上升级,客户不同意的。

离线wujianhui

只看该作者 6楼 发表于: 2014-07-17
那台系统有安装Qt3.3.8,我们把软件移植上去编译,应该是没问题。
但是我是想学习一下linux系统发布。
我记得原来移植Qt程序到开发板都没这问题呀
离线wujianhui

只看该作者 5楼 发表于: 2014-07-17
回 寒夜行人 的帖子
寒夜行人:
1.自己安装一台rhel系统试试,看运行效果
2.把缺少的动态库放到程序运行的当前目录中
3.写脚本启动程序,先写当前路径添加到系统库路径中的命令,在写启动你的程序的命令
这样就不会有缺少库一说,也不用安装新的软件
试一下
.......

测试将/lib64/libc.so.6 拷贝到另一台出现新的问题,运行提示ELF file OS ABI invalid。重新启动后,无法登陆了,安全模式无法删除此文件了。。。
离线寒夜行人

只看该作者 4楼 发表于: 2014-07-17
回 adonais 的帖子
adonais:别乱回答,误导人家.
真正的问题是RHEL5.9系统上的glibc版本过低,静态发布也不可行.
解决问题的方法:
1)升级RHEL5.9上的glibc.
....... (2014-07-17 20:13) 

是不是误导,我确实没有在这个系统上试过,你说的确实有道理,在其他应用过程中,我的方法也使用过 是可以行的。我回答只是提供一个建议,真正怎么解决还是看楼主自己的。
1条评分金钱+3
wujianhui 金钱 +3 - 2014-07-21
离线寒夜行人

只看该作者 3楼 发表于: 2014-07-17
是不是误导,我确实没有在这个系统上试过,你说的确实有道理,在其他应用过程中,我的方法也使用过 是可以行的。
离线adonais

只看该作者 2楼 发表于: 2014-07-17
回 寒夜行人 的帖子
寒夜行人:1.自己安装一台rhel系统试试,看运行效果
2.把缺少的动态库放到程序运行的当前目录中
3.写脚本启动程序,先写当前路径添加到系统库路径中的命令,在写启动你的程序的命令
这样就不会有缺少库一说,也不用安装新的软件
试一下 (2014-07-17 15:46) 

别乱回答,误导人家.
真正的问题是RHEL5.9系统上的glibc版本过低,静态发布也不可行.
解决问题的方法:
1)升级RHEL5.9上的glibc.
2)在RHEL5.9上编译好Qt4.8.4,然后大部分的linux都可以使用了.
3)比较复杂,不多说了.
2条评分金钱+3威望+1
wujianhui 威望 +1 - 2014-07-21
wujianhui 金钱 +3 - 2014-07-21
离线寒夜行人

只看该作者 1楼 发表于: 2014-07-17
1.自己安装一台rhel系统试试,看运行效果
2.把缺少的动态库放到程序运行的当前目录中
3.写脚本启动程序,先写当前路径添加到系统库路径中的命令,在写启动你的程序的命令
这样就不会有缺少库一说,也不用安装新的软件
试一下

补充一下,为什么不找一台RHEL5.9-x86_64来编译调试程序呢,安装一个较早版本的Qt也是可以的
快速回复
限100 字节
 
上一个 下一个