As many other gophers, I am exited getting my go applications compiled and running on the Raspberry Pi / PI 2. Since the Raspberry Pi 1 is powered by an ARMv6 and the Raspberry Pi 2 by an ARMv7 CPU, this requires to cross compile Go applications in order to run them on these architectures and different operating systems.
With Go version 1.5 cross compilation has become a lot easier. So, in this article I will show how to cross compile a Go application for different operating systems and architectures. In my example this will be done for a Raspberry Pi 2 Model B (ARMv7) running FreeBSD as it’s operating system. As this is just an example, you can cross compile for a variety of many other operating systems and architectures since the process is always the same.
How to cross compile with Go 1.5
Like already mentioned, since Go version 1.5 the process has become very simple:
- Set the
GOARCHenvironment variables to the correct value of the target operating system and architecture.
go buildas regular.
The Go documentation provides a list with all valid and supported compilation of the
GOARCH environment variables here:
So in my case for the Raspberry Pi 2 Model B running FreeBSD,
GOOS needs to be set to
freebsd. In order to generate a ARM compatible binary
GOARCH is set to
You my have recognized that the optional variable
GOARM has been set to
7. It enables support for ARMv7 instead of using the default value
6 for ARMv6. The difference is, that while the application will not run on old Raspberry Pi models, it takes advantage of a few more floating point registers and operations of the ARMv7 CPU from the Raspberry Pi 2.
If you are in doubt, leave this variable unset for maximum compatibility unless you have a reason to adjust it.
Also, note that when cross compiling, always use
go build, and not
go install. The reason is that
go install caches compiled packages to the /pkg directory. When doing cross compiling, you normally want to avoid this. The
go build command cleans up most of this stuff after compilation. For that reason remember to use the
build command over
install when cross compiling for other operating systems and architectures.