Golang交叉编译配置

问题描述

在阅读 kube-ovn 源码时,发现源码中引用的 netlink 库在 windows 环境下,有些代码引用失败。错误如下图:

netlink包引用错误

这是因为 netlink 包在不同的操作系统下实现有差异,netlink 库 build 是区分操作系统的,我需要应用 linux 环境下的版本,但是在 Windows 的开发环境中,默认的操作系统是 windows,并且是开启 CGO 的,如下图:

![build tags](./2021-10-19-Golang交叉编译配置/build tags.png)

CGO_ENABLED=0的意思是使用C语言版本的GO编译器,参数配置为0的时候就关闭C语言版本的编译器了,交叉编译不支持 CGO 所以要禁用它。

解决方法

配置 Goland 的 build tags,设置 GOOS=linux,CGO_ENABLED=0,如下图所示:

![交叉编译build tags配置](./2021-10-19-Golang交叉编译配置/交叉编译build tags配置.png)

正确配置之后,netlink 包就能够正常引用了。

其他补充

Mac 下编译 Linux 和 Windows 64位可执行程序
1
2
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Linux 下编译 Mac 和 Windows 64位可执行程序
1
2
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Windows 下编译 Mac 和 Linux 64位可执行程序
1
2
3
4
5
6
7
8
9
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go
  • GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
  • GOARCH:目标平台的体系架构(386、amd64、arm)