Golang 的静态编译

Python012

Golang 的静态编译,第1张

Go 语言和 C 语言的一个很大的区别是, Go 语言只静态编译,做个测试:

一方面是 Go 语言编译后的可执行文件大小比 C 语言的大很多,

另一方面是 C 语言的可执行文件需要依赖 glibc 动态库,

用 ldd 命令可以看出来:

或者直接删除 glibc 动态库, C 可执行程序报错,而 Go 的还能运行:

这时候只有内部命令可以运行,外部命令,包括 ln 甚至最常用的 ls 命令也不能运行了:

设置好 LD_PRELOAD 环境变量之后, ln 命令可以运行,但是 sudo 仍然不能运行

只能靠 root 用户来重新创建软连接了:

所以用 sudo 来 rm 文件要小心,还是用 root 比较好。如果没有预先留一个打开的 root 终端,登录都登不进去。

GraphicsMagick,一款高性能的图片处理工具,由于项目需要,用到它,自然而然用到了关于gm的第三方库 https://github.com/gographics/gmagick 这个库按照作者的提示,要安装GraphicsMagick-devel依赖。

项目写完了,接下来用alpine做为基础镜像,准备制作项目的镜像。

golang项目,是在ubuntu下编写的,编译成二进制文件了,只要把二进制文件放进镜像里即可,遇到的问题有2个

1 容器跑起来,一直报二进制文件no found

我认认真真的确认了文件,以及它的路径,确实是存在的,怎么会报文件找不到呢?!

原来是musl和glibc是兼容的问题,在Dockerfile里要加以下两步

2 Error loading shared library libGraphicsMagickWand-Q16.so.2: No such file or directory

明明按要求安装GraphicsMagick-devel依赖,为啥还报这种错

于是想到了,是不是也要ln做一下软链接呢?于是学着上面的样子在Dockerfile里补上

再跑,问题依旧,莫非是软连接的地址写错了!回到开发的电脑上用ldd命令查看一下

果然,编译后的二进制文件依赖路径是/lib,而不是/lib64

于是,修改Dockerfile里的写法

问题解决,开心:)

参考资料:

https://cloud.tencent.com/developer/article/1419659

您好,Golang编译Android SO无法加载的原因可能是因为Golang不支持Android平台,也可能是因为Golang编译器的版本不兼容Android平台。此外,如果您的Android SO文件有语法错误,或者编译器版本不兼容,也可能导致加载失败。因此,要解决Golang编译Android SO无法加载的问题,您需要检查Android SO文件是否有语法错误,并确保Golang编译器的版本与Android平台兼容。