SQLiteを使うGoアプリをWindows上でクロスコンパイルする方法
Windows10 64bit環境にて、mattn/go-sqlite3を使用するアプリケーションをLinux向けにクロスコンパイルしようとしたところ、下記のエラーが発生してコンパイルに失敗しました。
公式のIssueでも類似の現象が報告されていて未解決のように見えるのですが、対応方法をご存知の方がいましたらご教示願います。
# github.com/mattn/go-sqlite3
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:18: undefined: SQLiteConn
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:26: undefined: SQLiteConn
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:27: undefined: namedValue
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:29: undefined: namedValue
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:35: undefined: SQLiteConn
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:36: undefined: namedValue
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:44: undefined: SQLiteConn
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:49: undefined: SQLiteConn
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:54: undefined: SQLiteStmt
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:63: undefined: SQLiteStmt
C:\Users\%username%\go\src\github.com\mattn\go-sqlite3\sqlite3_go18.go:36: too many errors
使用したコード(sample.go):
package main
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, _ := sql.Open("sqlite3", "./test.db")
defer db.Close()
}
クロスコンパイルのために使用したコマンド:
set GOOS=linux
set GOARCH=amd64
go build sample.go
以下は冗長な情報かも知れませんが…
go envの結果:
set GOARCH=amd64
set GOBIN=
set GOEXE=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=linux
set GOPATH=C:\Users\%username%\go
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set GOGCCFLAGS=-fPIC -m64 -fmessage-length=0 -fdebug-prefix-map=C:\Users\%username%\AppData\Local\Temp\go-build450776071=/tmp/g
o-build -gno-record-gcc-switches
set CXX=g++
set CGO_ENABLED=0
set PKG_CONFIG=pkg-config
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
mattn/go-sqlite3をインストールするためにgccが必要だったのでtdm-gccをインストールしてあります。
set CGO_ENABLED=1
してコンパイルを試みると、エラー内容が下記に変わりました。
# runtime/cgo
C:\Users\%username%\AppData\Local\Temp\go-build051239462\runtime\cgo\_obj\_cgo_export.c:1:0: error: -fPIC ignored for target (a
ll code is position independent) [-Werror]
/* Created by cgo - DO NOT EDIT. */
^
cc1.exe: all warnings being treated as errors
2017/03/28追記
たくさんの有益な情報を情報を頂いたにもかかわらず、そもそもLinuxやコンパイラの知識が足りず以下の試みの結果クロスコンパイルに失敗しました。
- TDM-GCC-64のインストールフォルダ\binから、クロスコンパイラを探す
- それっぽいものが見つからない
- bash on windows でコンパイル
- おそらく色々いじっていたのが原因で
go build
がエラー
- おそらく色々いじっていたのが原因で
- cygwinでクロスコンパイラを取得しようとして
Unable to get setup from <ftp://ftp.cygwinports.org/pub/cygwinports/>
を解決できずに断念
Linuxのバイナリを吐けるgccがあれば解決というアドバイスに従って、Virtual BoxのUbuntuでビルドすることで解決しました。