0%

Go语言交叉编译

很多时候会有这样的场景出现,使用Mac开发或使用Windows开发,需要编译成Linux系统的执行文件,此时就需要用到交叉编译。

一、概念

      很多时候会有这样的场景出现,使用Mac开发或使用Windows开发,需要编译成Linux系统的执行文件,此时就需要用到交叉编译。在1.5+版本后(通过自举),Go程序编译时可通过设置环境变量实现交叉编译,从而大大提高了开发效率。

编程语言的自举就是完全依靠自身语言(如go)写出自己的编译器、解释器来编译自身。

二、使用

  1. 可通过go tool dist list查看当前版本支持的系统和架构

常见如下:

GOOS GOARCH
darwin 386
darwin amd64
darwin arm
darwin arm64
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
linux 386
linux amd64
linux arm
linux arm64
linux ppc64
linux ppc64le
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
openbsd arm
plan9 386
plan9 amd64
solaris amd64
windows 386
windows amd64
  1. 使用
    • main.go
1
2
3
4
5
6
7
8
9
10
package main

import (
"fmt"
"runtime"
)

func main() {
fmt.Printf("OS: %s\nArchitecture: %s\n", runtime.GOOS, runtime.GOARCH)
}
  • windows/linux/mac
    • CGO_ENABLED=0 GOOS=window GOARCH=amd64 go build main.go
    • CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
    • CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
  1. 默认情况下Go环境变量CGO_ENABLED=1(可通过go env查看),即默认开启cgo,意为允许在Go代码中调用C代码。
    • 要使用CGO特性,需要安装C/C++构建工具链,在MacOS和Linux下是要安装GCC,在windows下是需要安装MinGW工具,同时需要保证环境变量CGO_ENABLED被设置为1,这表示CGO是被启用的状态。
    • 交叉编译时CGO默认是禁止的,亦可在编译时指定CGO_ENABLED=0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
"runtime"
)

/*
#include <stdio.h>

void sayHello(){
int a;
printf("请输入数字:");
scanf("%d", &a);
printf("a的值为:%d", a);
}
*/
import "C"

func main() {
fmt.Printf("OS: %s\nArchitecture: %s\n", runtime.GOOS, runtime.GOARCH)
C.sayHello()
}

CGO_ENABLED=1 go run main.go

CGO_ENABLED=0 go run main.go

三、参考

  1. 参考一