How to cross-compile Go programs for Windows, macOS, and Linux
How do you build Go binaries that target operating systems and architectures other than your own? This is called cross-compiling, and it’s easy to do with Go.
Programs written in Go can easily be compiled for a wide variety of target operating systems such as Windows, macOS, and Linux by using the GOARCH
and GOOS
environmental variables. These represent the compilation architecture and the name of the target operating system respectively, and are set to your host compilation architecture (GOHOSTARCH
) and operating system (GOHOSTOS
) by default.
You can use the go env
command to view the values of these variables on your machine:
$ go env
...
GOARCH="amd64"
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
...
Compile for Windows
Here’s the command you need to run to compile your Go project for a 64-bit Windows machine:
$ GOOS=windows GOARCH=amd64 go build -o bin/app-amd64.exe app.go
In this scenario, GOOS
is windows, and GOARCH
is amd64
indicating a 64-bit architecture. If you need to support a 32-bit architecture, all you need to do is change GOARCH
to 386
.
$ GOOS=windows GOARCH=386 go build -o bin/app-386.exe app.go
Compile for macOS
The GOARCH
values for Windows are also valid for macOS, but in this case the required GOOS
value is darwin
:
# 64-bit
$ GOOS=darwin GOARCH=amd64 go build -o bin/app-amd64-darwin app.go
# 32-bit
$ GOOS=darwin GOARCH=386 go build -o bin/app-386-darwin app.go
Compile for Linux
To build your Go program for Linux, use linux
as the value of GOOS
and the appropriate GOARCH
value for your target CPU architecture:
# 64-bit
$ GOOS=linux GOARCH=amd64 go build -o bin/app-amd64-linux app.go
# 32-bit
$ GOOS=linux GOARCH=386 go build -o bin/app-386-linux app.go
Other operating systems and CPU architectures
Go supports a lot more OS and CPU architecture combinations than what I’ve described above, but these are the most used ones. If you need to compile for ARM, Android, Web Assembly, or other targets, please refer to the Go docs to see the combinations of GOOS
and GOARCH
that are available to you.
Thanks for reading, and happy coding!