我的提问: (按时间降序排列)
有没有好的方式,可以让在高版本机器上编译出的二进制文件,也可以在低版本机器上运行
我有一个项目用到了CGO,在一台ubuntu 20.04的编译机上编译后,分发到其他机器上执行,但是这些机器中有很多ubuntu版本很低,可能是ubuntu 16.04或ubuntu 18.04。
这样在执行二进制文件时,会报错类似于 /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29’ not found
我尝试在go build时使用 -a -ldflags ‘-extldflags “-static”‘ .,但似乎因为有使用cgo,而无法编译成功。
有没有什么好的方式,如在go build时添加合适tag,来解决这个问题?
这是一个常见的问题,涉及到在一个版本的 Linux 系统上编译程序,然后在另一个版本的系统上运行。这主要是因为你的程序依赖于特定版本的 glibc,而这个版本可能不在你的目标系统上。
如果你使用 CGO 和一些本地库,那你的二进制文件可能会依赖于系统的动态链接器和 C 库,这就是为什么你在尝试静态链接时会遇到问题。
一种可能的解决方案是在一个和目标系统版本相同(或更低)的系统上进行编译。例如,如果你的目标系统是 Ubuntu 16.04,那么你应该尝试在 Ubuntu 16.04 上进行编译。这可以通过使用 Docker 或者虚拟机来实现。
另外,你可以尝试使用 Docker 来创建一个包含所有依赖的完整环境,然后在这个环境中运行你的程序。这种方式可以避免版本依赖带来的问题,但是可能会带来一些额外的复杂性。
这是一个使用 Docker 为 Go 应用创建运行时环境的基本示例:
1 | # 构建阶段 |
在这个示例中,我们首先在一个包含 Go 的容器中构建我们的应用,然后在一个 Ubuntu 18.04 的容器中运行它。这样,我们的应用会在一个和目标系统相同的环境中运行,避免了版本冲突的问题。
你也可以尝试使用交叉编译,但是这可能会更复杂,因为你需要为目标系统提供正确版本的 glibc 和其他依赖。
Is it necessary to change the behavior of maps.Keys and maps.Values?
Why is the reason that the flame graph in go pprof rotated 180 degrees?
Can we further optimize the scheduling order of goroutines in sync.Mutex?
Very curious, why is “3:04 PM” named Kitchen in the time package?
When will the official encoding/json package support parsing json5?
原文链接: https://dashen.tech/2020/06/13/golang-nuts群组中一些有趣的问题/
版权声明: 转载请注明出处.