44

Suppose I'm a primarily Linux user, but I'm developing an application in Go that I want to be cross platform. I've searched around, but I can't seem to find information to absolve the following:

  1. If I go install a binary on my amd64 Ubuntu system, will it also work on anyone else's 64-bit Ubuntu/Debian system?
  2. How can I use go install to build an x86_64 binary that will also run out-of-the-box on 32-bit Debianlikes?
  3. If I must use Windows to make a binary which will run on Windows, how can I also ensure that even if my Windows system is 64-bit the executable will be built for x86_64?

My questions in effect boil down to, "how static/portable is go's linker/compiler?"

cat
  • 3,888
  • 5
  • 32
  • 61
  • 1
    I'm not sure what you're asking. Binaries are portable between systems with the same OS and architecture. Go builds the binary for your host GOOS and GOARCH unless you specify otherwise. You can't take a 64bit binary and run it on a 32bit system. – JimB Nov 23 '15 at 14:04
  • 1
    That hasn't been my experience with creating binaries that are meant to be cross platform. – cat Nov 23 '15 at 14:05
  • 2
    To answer your question: "Not at all." Simply because this is impossible to do. No compiler/linker/loader/toolchain can do this. Google cross compilation which is trivial with Go. – Volker Nov 23 '15 at 14:06
  • If that hans't been your experience, then you need to show us the problem you're having. The question "how static/portable is go's linker/compiler?" doesn't make much sense. – JimB Nov 23 '15 at 15:02
  • 2
    Off topic. This tool easy your life https://github.com/mitchellh/gox – holys Nov 25 '15 at 14:52

1 Answers1

50
  1. Yes it will; this is true of basically all binaries compiled for 64-bit Linux, not just those written in Go (except for shared libraries, which Go doesn't rely on)
  2. You can set the GOOS and GOARCH environment variables before building: GOOS=windows GOARCH=386 go build (or go install or whatever), etc
  3. By default a binary will be built for the system you're running, but this isn't necessary - see 2
joshlf
  • 21,822
  • 11
  • 69
  • 96