社区
Linux/Unix社区
帖子详情
linux程序怎样静态链接glibc相关的库,程序发布不依赖glibc版本
qq_37680897
2018-07-23 05:02:04
最近发布一款Linux程序在自己开发环境上跑得好的了,程序到客户目标机就提示glibc版本过低。目前了解到可以通过下载新版本的glibc升级客户目标机系统即可,但客户不愿意,希望能发布一款能够静态链接上glibc相关的库文件。求大神指点,或者给个demo参考,谢谢!
补充一点:程序需要链接一个其他厂商提供的.so动态库。
...全文
1803
7
打赏
收藏
linux程序怎样静态链接glibc相关的库,程序发布不依赖glibc版本
最近发布一款Linux程序在自己开发环境上跑得好的了,程序到客户目标机就提示glibc版本过低。目前了解到可以通过下载新版本的glibc升级客户目标机系统即可,但客户不愿意,希望能发布一款能够静态链接上glibc相关的库文件。求大神指点,或者给个demo参考,谢谢! 补充一点:程序需要链接一个其他厂商提供的.so动态库。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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去下载源码,。。。不说了,点到为止~
muslrust:用于构建基于musl的
静态
锈二进制文件的Docker环境
碎屑 一个普通的docker环境,用于构建用锈编译并与musl而非
glibc
链
接
的
静态
二进制文件。 每晚在travis上建立。 如果您需要外部C
依赖
项和/或需要CI映像来编译Musl二进制文件,则这很有用。 在本地,如果不需要C
依赖
项,可以对rustup target add x86_64-unknown-
linux
-musl 。 这个容器使用musl-gcc因此我们也可以针对这些进行
静态
链
接
。 对于嵌入式目标,请考虑将作为更通用的解决方案。 用法 从锈项目根目录拉出并运行: docker pull clux/muslrust docker run -v $PWD :/volume --rm -t clux/muslrust cargo build 您应该在目标文件夹中有一个
静态
可执行文件: ldd target/x86_64-unknown-
linux
-musl/debug/EXECUTABLE not a dynamic executable 从那里开始,您可以将其包含在空白的docker映像,distroless / static或alpine(如
stagit:个人stagit叉子
斯塔吉特
静态
git页面生成器的个人fork。它为git存储
库
生成
静态
HTML页面。 该fork使用将README markdown转换为HTML,然后在每个存储
库
的页面中显示它,这增加了新的
依赖
关系。最重要的是,资产已更改,从而创建了个人主题。脚本也已更改以满足我的需要。 用法 按存储
库
制作文件: $ mkdir -p htmldir && cd htmldir $ stagit path-to-repo 制作存储
库
的索引文件: $ stagit-index repodir1 repodir2 repodir3 > index.html 编译安装 $ make # make install 依存关系 C编译器(C99)。 libc(已通过OpenBSD,FreeBSD,NetBSD,
Linux
测试:
glibc
和musl)。 libgit2(v0.22 +)。 POSIX mak
MySQL DBA数据
库
运维高薪必备教程
MySQL是当前世界上应用最广泛的关系型数据
库
。十年前错过了Oracle,十年后就不要再错过MySQL,在这互联网盛世的时代,MySQL DBA供不应求,同等条件下薪水已远远超过了Oracle DBA。想要成为高级的MySQL DBA,除了自身努力之外,还需要一份靠谱的视频教程。由黑马
程序
员
Linux
云计算+运维开发学科精心打造《MySQL DBA数据
库
运维高薪必备教程》,让你从数据
库
小白成长为高薪的MySQL DBA大神。 大纲: 1、MySQL数据
库
概述 2、
Linux
系统环境准备 3、MySQL的三种安装方式(YUM、
GLIBC
、源码) 4、MySQL数据
库
操纵语言之SQL 5、MySQL备份与还原(逻辑备份) 6、Percona XtraBackup专业备份工具(全量备份与增量备份) 7、MySQL主从复制(AB复制、基于GTIDs的主从复制实践) 8、MySQL半同步复制 9、MHA(数据
库
高可用解决方案) ......
linux
静态
编译
glibc
,GCC
静态
链
接
glibc
库
如果你的编译环境是高
版本
的
glibc
库
,而运行
程序
的环境(机器)安装的
glibc
是低
版本
的话,在运行
程序
的时候,就会告诉你cannot find
GLIBC
_2.14类似这样的错误,上面的2.14根据你链
接
的
glibc
版本
不同而变化。怎么解决这个问题呢?就是将
glibc
进行
静态
链
接
。在使用gcc编译链
接
的时候,默认是采用动态链
接
的方式,如果要指定
静态
链
接
glibc
库
,则使用-static选项。例如...
LInux
-Ubuntu
静态
编译C++可执行文件,不
依赖
glibc
linux
程序
怎样
静态
链
接
glibc
相关
的
库
,
程序
发布
不
依赖
glibc
版本
?这样后,就不会又
glibc
依赖
的问题了。这就是因为
glibc
库
不一致导致的。
Linux/Unix社区
23,125
社区成员
74,509
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章