自分用めも

初心者ちっくなプログラムネタを中心に、自分用の覚え書きをメモっていくための場所です。

Windows10でVSCodeでlinux向けのgolangのgcc参照ありのソースをbuildする

環境

OS: Windows10
IDE: Visual Studio Code 1.50.0 (VSCode)
Go: go version go1.15.2 windows/amd64

前提

ビルドしたバイナリを開発サーバに持っていって動かしている。
Windows上ではデバッグしていない。
VSCode上で、インポートの参照先でgccが無いとエラーが出ている。

1. エラーを無視して普通にビルドした場合

> $Env:GOOS = "linux"; $Env:GOARCH = "amd64"; go build

ビルドは通る。エラーなし。

Linuxubuntu)上で起動もするが、アクセスすると下記エラーが発生。
以下抜粋。

"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 で良い。