Windows10でVSCodeでlinux向けのgolangのgcc参照ありのソースをbuildする
環境
OS: Windows10
IDE: Visual Studio Code 1.50.0 (VSCode)
Go: go version go1.15.2 windows/amd64
1. エラーを無視して普通にビルドした場合
> $Env:GOOS = "linux"; $Env:GOARCH = "amd64"; go build
ビルドは通る。エラーなし。
Linux(ubuntu)上で起動もするが、アクセスすると下記エラーが発生。
以下抜粋。
"status":500, "error":"Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub"
2. 言われた通り、ビルド時に「CGO_ENABLED」を1にしてみる
> $Env:GOOS = "linux"; $Env:GOARCH = "amd64"; $Env:CGO_ENABLED = 1; go build exec: "gcc": executable file not found in %PATH%
今度はビルド時点(powershell)で怒られた。
gccなんてインストールしてないから当然だが。
3. Windows(64bit)用のgccである、「mingw-w64」をインストールしてからビルドしてみる
# runtime/cgo gcc_linux_amd64.c: In function '_cgo_sys_thread_start': gcc_linux_amd64.c:61:2: error: unknown type name 'sigset_t'; did you mean '_sigset_t'?
怒られた。
調べたらコンパイラはあくまでWindows用のバイナリを作るもので、Linux向けでは無いらしい。
となると出来なくて当たり前か。
Linux向けのビルドもやろうと思えばできるけど、ライブラリとか全部自前で揃えないといけないらしい。諦め。
4. Windows Subsystem for Linuxをインストールして、VSCodeと連携する
どうもこれが正解らしい。
docs.microsoft.com
「Windows クロスコンパイル」とかでググっても出てこないよねこれ。。
インストールして連携すると、VSCode上でPowerShellの代わりにLinuxシェルが起動するようになる。
前提の「ビルドしたバイナリを開発サーバに持っていって動かしている。Windows上ではデバッグしていない」が崩れるが、多分すごく楽。
上記リンクのとおりに進め、Ubuntu 18.04 TLSをインストールする。
Windowsのスタートメニューのプログラム一覧からUbuntuを起動。ターミナルが立ち上がる。
まず、Ubuntu内のaptを最新にする。
sudo apt update sudo apt -y upgrade
次に、goをインストールする。
goはaptだとバージョンが古いのでgoenvというツールを使う。
WSLで最新バージョンのGo環境構築 - Qiita
git clone https://github.com/syndbg/goenv.git ~/.goenv
.bash_profile
export GOENV_ROOT=$HOME/.goenv export PATH=$GOENV_ROOT/bin:$PATH eval "$(goenv init -)"
goenv install -l # 最新バージョンを確認、指定 goenv install 1.15.3 goenv global 1.15.3
最後に、gcc、go-cgoをインストールする。
sudo apt install gcc sudo apt install gccgo-go
以上で仮想環境の中でlinuxネイティブになったので、
buildはシンプルに go build で良い。