かなり単純なローカル CGO プロジェクトの構築に問題があります。たった 3 つのファイル (glut.go、support.c、および support.h ファイル) からなるこの非常に小さな CGO パッケージについて考えてみましょう。
C:\Go\src\pkg\github.com\zombiezen\Go-GLUT\glut
次に、いくつかの秘密の魔法が発生し、go getは次の出力ファイルをビルドします。
C:\Go\pkg\windows_amd64\github.com\zombiezen\Go-GLUT\glut.a
ただし、3 つのソース ファイルを \mytmp にコピーし、\mytmp に cd してbuild -o glut.a glut.goを実行すると、次のような 40-60 エラー メッセージが表示されます。
C:\Users\roxor\AppData\Local\Temp\go-build191975110\command-line-arguments\_obj\glut.cgo2.o: In function `_cgo_b46885fb7c57_Cfunc_goCreateMenu':
./glut.go:195: undefined reference to `goCreateMenu'
-xコマンドライン引数を指定してgo getを実行すると、ビルド プロセス中にsupport.cが取得され、gcc に渡されることがわかります。
gcc -I . -g -O2 -m64 -mthreads -I $WORK\github.com\zombiezen\Go-GLUT\glut\_obj\ -o $WORK\github.com\zombiezen\Go-GLUT\glut\_obj\support.o -c .\support.c
ただし、go build -xでは、これは当てはまりません。support.c はスキップされます。なんで?go get とまったく同じようにgo buildを呼び出すにはどうすればよいですか?