33554


Windows10 64bit環境にて、[mattn/go-sqlite3](https://github.com/mattn/go-
sqlite3)を使用するアプリケーションをLinux向けにクロスコンパイルしようとしたところ、下記のエラーが発生してコンパイルに失敗しました。

[公式のIssue](https://github.com/mattn/go-
sqlite3/issues/327)でも類似の現象が報告されていて未解決のように見えるのですが、対応方法をご存知の方がいましたらご教示願います。

[code]

    # 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
    
[/code]

使用したコード(sample.go):

[code]

    package main
    
    import (
        "database/sql"
        _ "github.com/mattn/go-sqlite3"
    )
    
    func main() {
        db, _ := sql.Open("sqlite3", "./test.db")
        defer db.Close()
    }
    
[/code]

クロスコンパイルのために使用したコマンド:

[code]

    set GOOS=linux
    set GOARCH=amd64
    go build sample.go
    
[/code]

以下は冗長な情報かも知れませんが…

go envの結果:

[code]

    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
    
[/code]

mattn/go-sqlite3をインストールするためにgccが必要だったので[tdm-gcc](http://tdm-
gcc.tdragon.net/)をインストールしてあります。  
`set CGO_ENABLED=1`してコンパイルを試みると、エラー内容が下記に変わりました。

[code]

    # 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
    
[/code]

2017/03/28追記

たくさんの有益な情報を情報を頂いたにもかかわらず、そもそもLinuxやコンパイラの知識が足りず以下の試みの結果クロスコンパイルに失敗しました。

  * TDM-GCC-64のインストールフォルダ\binから、クロスコンパイラを探す 
    * それっぽいものが見つからない
  * bash on windows でコンパイル 
    * おそらく色々いじっていたのが原因で`go build`がエラー
  * cygwinで[クロスコンパイラ](http://www.ne.jp/asahi/hishidama/home/tech/windows/cygwin/linux_gcc.html)を取得しようとして`Unable to get setup from <ftp://ftp.cygwinports.org/pub/cygwinports/>`を解決できずに断念

Linuxのバイナリを吐けるgccがあれば解決というアドバイスに従って、Virtual BoxのUbuntuでビルドすることで解決しました。


CC BY-SA 3.0
2017-03-26T02:42:12.687
33538
2017-03-28T11:48:51.440
2017-03-28T11:48:51.440
9820
9820
question
windows go sqlite
SQLiteを使うGoアプリをWindows上でクロスコンパイルする方法


> 公式のIssueでも類似の現象が報告されていて未解決のように見えるのですが、対応方法をご存知の方がいましたらご教示願います。

未解決ではないです。

これらはどれも Windows 上でクロスCコンパイラを使わずにビルドしているのが原因です。  
Pure Golang であれば Windows 上で Linux のバイナリを出力できますが、CGO を使う場合 gcc を使うので、Linux
のバイナリを吐ける gcc を用意する必要があります。


CC BY-SA 3.0
2017-03-26T12:57:48.733
33554
2017-03-26T12:57:48.733
440
33538
answer