LoginSignup
3
1

Goのクロスコンパイルのありがたみを知る

Posted at

クロスコンパイル

Goはクロスコンパイルをサポートしています。
つまり、MacOS上でWindows上、Linux上それぞれで動作するバイナリを生成することができます。CPUアーキテクチャも複数サポートしています。

クロスコンパイルできると

実行環境用のバイナリを生成できるということは、わざわざGoが動作する環境を用意する必要がありません。(Goの環境構築は比較的容易ですが)
もっというと、リポジトリをcloneする必要がなかったり、コンテナにはバイナリ一つ載せればよいということになります。

クロスコンパイルできる環境

クロスコンパイルできる環境一覧です。
OS/CPUアーキテクチャで表示されています。

$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
freebsd/riscv64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/loong64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
wasip1/wasm
windows/386
windows/amd64
windows/arm
windows/arm64

ビルドする際、GOOS, GOARCHで環境を指定します。
M1以降のMacOSの場合以下のようになります。

GOOS=darwin GOARCH=arm64 go build .

環境変数を指定してビルドを実行してみます。
実行環境はM1 Macです。

main.go
package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}
$ GOOS=darwin GOARCH=arm64 go build .
$ ./main
Hello, World!

次に、linux用のビルドし、MacOSでの実行を試してみます。

$ GOOS=linux GOARCH=amd64 go build .
$ ./main
-bash: ./main: cannot execute binary file

Docker上のLinux環境で試してみる

ubuntu環境に先程ビルドしたバイナリをコピーして実行してみます。

FROM ubuntu:latest

WORKDIR /app

COPY ./main .

ENTRYPOINT [ "./main" ]

実行します。

$ docker build -t go_exec_on_ubuntu .
$ docker run -it go_exec_on_ubuntu
Hello, World!

良さそうです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1