登录
首页 >  Golang >  Go问答

创建静态链接到glibc并动态链接到libGL.so的CGO程序的方法

来源:stackoverflow

时间:2024-03-14 10:45:26 471浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《创建静态链接到glibc并动态链接到libGL.so的CGO程序的方法》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我的操作系统是 kali,运行 glibc_2.32。我需要为运行 glibc_2.28 的 debian 10 系统构建一个 cgo 应用程序。

如果我用动态链接的方式构建go ,它无法在debian系统上运行,它显示glibc不匹配:

version `glibc_2.29` not found
version `glibcxx_3.4.29` not found
version `glibc_2.32` not found

所以我尝试了静态链接:cgo_ldflags='-static' go build。 gui 库使用 opengl 并且显示错误:

# github.com/go-gl/gl/v3.2-core/gl
/usr/bin/ld: cannot find -lGL

搜索了一段时间,发现libgl与gpu驱动有关,无法静态链接。

然后我尝试通过以下方式动态链接 libgl.so 和静态链接其他库:

cgo_ldflags='-l/usr/lib/x86_64-linux-gnu -bdynamic -lgl -static' go build

但同样的错误:“找不到-lgl”

我不想用docker,它太重了。而且我不认为从 debian 10 升级到 11 可以解决问题,将来可能会有其他一些客户端运行不同的操作系统。最好的解决方案是什么?


正确答案


-static 标志告诉链接器:执行完全静态链接。不管放在-lGL之前还是之后,含义都是一样的。

要静态链接某些库并动态链接其他库,请参阅 this answer

也就是说,您想要做的事情是不可能的:如果您的链接中有任何动态库,那么 libc.so.6 也必须动态链接.

太糟糕了。您必须使用 docker,或者设置 chroot 环境,或者自己构建一个“Linux 到旧版 Linux”交叉编译器。 docker 可能是最容易实现的。

今天关于《创建静态链接到glibc并动态链接到libGL.so的CGO程序的方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>