内容目录
直接go build 打包运行报错
k logs openapi-65cf7665d-2s48b -n kumo ✔ base production-legolas-v130 ⎈ 22:33:39
Defaulted container "openapi" out of: openapi, init-coredump (init)
exec /kumo-openapi/openapi: exec format error
最后对比以前能运行的包
root@ubuntuserver1:/www/wwwroot# file bakopenapi
bakopenapi: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=8l4M8kC1ugodeoIz6HG3/dcFVMwRcvzqAUom2fg3y/wzuM093mz6vsiTcJmTfp/1ORr-FZ1E05DV3E3C84D, with debug_info, not stripped
root@ubuntuserver1:/www/wwwroot# file openapi.old
openapi.old: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=uEQMuV_Jz3nIBQy2wNZQ/O_1xQiCyG0qa1dDqbxLW/nu1k99q6utHIEQe8H31s/AOoz3vqHH1UDAGvh9dsP, with debug_info, not stripped
两个文件 bakopenapi 和 openapi.old 都是 64 位的 ELF 可执行文件,并且它们都是针对 x86-64 架构构建的,但有一个关键的不同点:
bakopenapi:是动态链接的(dynamically linked),依赖于系统上的动态库(如 /lib64/ld-linux-x86-64.so.2)。
openapi.old:是静态链接的(statically linked),它不依赖外部动态库,所有依赖的库都已经打包进了可执行文件。
静态链接打包
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o openapi .
在 Go 中,静态链接可以确保所有依赖库都打包进可执行文件,不依赖系统的动态库。要静态链接打包 Go 应用程序,你可以通过设置 CGO_ENABLED=0
来禁用 CGO,并确保生成的可执行文件是完全静态链接的。以下是静态链接打包的步骤:
静态链接打包 Go 应用程序步骤:
-
设置环境变量:
CGO_ENABLED=0
禁用 CGO,确保程序不使用 C 库。- 使用
-ldflags
设置链接器标志,确保链接过程完全静态化。
-
使用命令:
打包时使用以下命令:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o your_binary_name .
CGO_ENABLED=0
:禁用 CGO,生成纯 Go 静态二进制文件。GOOS=linux GOARCH=amd64
:指定目标平台(此处为 Linux 64 位架构,视需要调整)。-a
:强制重新编译所有包。-ldflags '-extldflags "-static"'
:通过传递给链接器的标志确保生成静态链接的可执行文件。-o your_binary_name
:指定输出的二进制文件名称。
-
示例:
如果你的项目结构是这样的:my-go-project/ ├── main.go
然后在
my-go-project
目录下运行以下命令:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o my-static-binary .
-
验证静态链接:
打包完成后,可以通过file
命令检查生成的可执行文件是否是静态链接的:file my-static-binary
输出应该类似于:
my-static-binary: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=..., not stripped
这样,生成的二进制文件将是完全静态链接的,可以在没有外部依赖的情况下运行。
近期评论