linux程序怎样静态链接glibc相关的库,程序发布不依赖glibc版本

qq_37680897 2018-07-23 05:02:04
最近发布一款Linux程序在自己开发环境上跑得好的了,程序到客户目标机就提示glibc版本过低。目前了解到可以通过下载新版本的glibc升级客户目标机系统即可,但客户不愿意,希望能发布一款能够静态链接上glibc相关的库文件。求大神指点,或者给个demo参考,谢谢!

补充一点:程序需要链接一个其他厂商提供的.so动态库。
...全文
1803 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2020-01-24
  • 打赏
  • 举报
回复 1
编译环境与运行环境不一致,就会出现你这种情况。更确切的说,编译环境的gcc(glibc)版本 > 运行环境,就会出现glibc版本不一致问题。 不改动客户环境的解决办法 1) 容器化部署, 涉及docker。较复杂,而且取决于客户是否同意 可操作性 ※※※ 2) 降级编译器版本。根据目标机器glibc版本,使用对应版本编译器。可以考虑在你们的编译环境额外装一套gcc。 可操作性 ※※※※※ 3)glibc是向前兼容的。提示glibc版本过低应该是你的代码中某些函数实现采用了最新glibc编译链接。可以ldd你软件的so文件,再strings 观察哪些函数采用了最新的glibc库,做相应的修改,使得低版本glibc也可以编译通过。 可操作性 ※※ 综上,方法二可行度相对较高。
clever101 2020-01-16
  • 打赏
  • 举报
回复
gcc如何在命令行中链接标准c库呢?
danscort2000 2018-07-25
  • 打赏
  • 举报
回复
这容易 解决,本身gcc就支持半静态方式连接
不过需要使用makefile文件方式进行
你可以选择将glibc stdc++库等全部使用-static静态连接,但是第三方提供的 动态库使用动态连接
建议你使用低版本glibc环境编译连接,例如centos7,这样编译出来的是for GNU Linux 2.6
放到高版本环境也不会有问题
qq_37680897 2018-07-24
  • 打赏
  • 举报
回复
引用 3 楼 ckc 的回复:
感觉在客户类似环境下编译更简单一些,或者docker?
全静态编译不依赖运行环境应该是不可能的吧


办法值得一试,或者在自己的环境下,更新与客户同一版本的glibc。
ckc 2018-07-24
  • 打赏
  • 举报
回复
感觉在客户类似环境下编译更简单一些,或者docker? 全静态编译不依赖运行环境应该是不可能的吧
qq_37680897 2018-07-23
  • 打赏
  • 举报
回复
动态库那个是其他厂商提供的,如果真的没其他办法。联系厂家也许可能改个静态库。但是glibc应该是不那么单纯的把源码或把静态库加到工程里编译就能通过吧。我有试过,但是都会莫名提示一些像程序入口没找到之类的。求大神做过的提供一个参考例子呀
文虫并雕 2018-07-23
  • 打赏
  • 举报
回复
不难吧?把你用到的动态库编译为静态库,加入到你最终的可执行文件就行了。glibc去下载源码,。。。不说了,点到为止~

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧