github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/cmd/cgo/doc.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 /* 6 Cgoを使用すると、Cコードを呼び出すGoパッケージを作成できます。 7 8 # goコマンドでcgoを使用する 9 10 cgoを使用するには、擬似パッケージ「C」をインポートする通常のGoコードを書きます。 11 その後、GoコードはC.size_tのような型、C.stdoutのような変数、またはC.putcharのような関数を参照できます。 12 13 「C」のインポートが直前にコメントで指定されている場合、そのコメントは前文と呼ばれ、 14 パッケージのC部分をコンパイルするときにヘッダーとして使用されます。 例えば: 15 16 // #include <stdio.h> 17 // #include <errno.h> 18 import "C" 19 20 プリアンブルには、関数や変数の宣言や定義を含むCコードを含めることができます。 21 これらは、パッケージ「C」に定義されているかのように、Goコードから参照できます。 22 プリアンブルで宣言されたすべての名前は使用できますが、小文字で始まる場合でも使用できます。 23 例外:プリアンブルの静的変数は、Goコードから参照できません。静的関数は許可されています。 24 25 $GOROOT/cmd/cgo/internal/teststdioと$GOROOT/misc/cgo/gmpを参照して、例を確認してください。 26 cgoの使用についての紹介については、「C?Go?Cgo!」を参照してください: 27 https://golang.org/doc/articles/c_go_cgo.html 。 28 29 CFLAGS、CPPFLAGS、CXXFLAGS、FFLAGS、およびLDFLAGSは、これらのコメント内の疑似#cgoディレクティブで定義できます。 30 これにより、C、C ++、またはFortranコンパイラの動作を調整できます。 31 複数のディレクティブで定義された値は連結されます。 32 ディレクティブには、その効果を制限するビルド制約のリストを含めることができます。 33 (制約構文の詳細については、https://golang.org/pkg/go/build/#hdr-Build_Constraints を参照してください。) 34 例えば: 35 36 // #cgo CFLAGS: -DPNG_DEBUG=1 37 // #cgo amd64 386 CFLAGS: -DX86=1 38 // #cgo LDFLAGS: -lpng 39 // #include <png.h> 40 import "C" 41 42 代わりに、'#cgo pkg-config:'ディレクティブに続いてパッケージ名を指定することで、 43 pkg-configツールを使用してCPPFLAGSとLDFLAGSを取得できます。 44 例えば: 45 46 // #cgo pkg-config: png cairo 47 // #include <png.h> 48 import "C" 49 50 デフォルトのpkg-configツールは、PKG_CONFIG環境変数を設定することで変更できます。 51 52 セキュリティ上の理由から、許可されるフラグは-D、-U、-I、および-lのみです。 53 追加のフラグを許可するには、CGO_CFLAGS_ALLOWを正規表現に設定し、新しいフラグに一致するようにします。 54 許可されるフラグを禁止するには、CGO_CFLAGS_DISALLOWを正規表現に設定し、禁止する必要がある引数に一致するようにします。 55 両方の場合、正規表現は完全な引数に一致する必要があります。-mfoo=barを許可するには、CGO_CFLAGS_ALLOW='-mfoo.*'を使用します。 56 単にCGO_CFLAGS_ALLOW='-mfoo'ではなく、同様の名前の変数が許可されるCPPFLAGS、CXXFLAGS、FFLAGS、およびLDFLAGSを制御します。 57 58 また、セキュリティ上の理由から、英数字文字といくつかの記号(例えば、'.'など)のみが許可されており、 59 予期しない方法で解釈されないいくつかの記号が許可されています。 60 禁止された文字を使用すると、「malformed #cgo argument」エラーが発生します。 61 62 ビルド時に、CGO_CFLAGS、CGO_CPPFLAGS、CGO_CXXFLAGS、CGO_FFLAGS、およびCGO_LDFLAGS環境変数は、 63 これらのディレクティブから派生したフラグに追加されます。 64 パッケージ固有のフラグは、環境変数ではなくディレクティブを使用して設定する必要があります。 65 これにより、変更されていない環境でビルドが機能するようになります。 66 環境変数から取得したフラグは、上記で説明したセキュリティ上の制限の対象外です。 67 68 パッケージ内のすべてのcgo CPPFLAGSおよびCFLAGSディレクティブは連結され、 69 そのパッケージのCファイルをコンパイルするために使用されます。 70 パッケージ内のすべてのCPPFLAGSおよびCXXFLAGSディレクティブは連結され、 71 そのパッケージのC++ファイルをコンパイルするために使用されます。 72 パッケージ内のすべてのCPPFLAGSおよびFFLAGSディレクティブは連結され、 73 そのパッケージのFortranファイルをコンパイルするために使用されます。 74 プログラム内の任意のパッケージのすべてのLDFLAGSディレクティブは連結され、リンク時に使用されます。 75 すべてのpkg-configディレクティブは連結され、同時にpkg-configに送信され、 76 各適切なコマンドラインフラグのセットに追加されます。 77 78 cgoディレクティブが解析されると、文字列${SRCDIR}の出現箇所は、ソースファイルを含むディレクトリの絶対パスに置き換えられます。 79 これにより、事前にコンパイルされた静的ライブラリをパッケージディレクトリに含め、適切にリンクすることができます。 80 例えば、パッケージfooがディレクトリ/go/src/fooにある場合: 81 82 // #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo 83 84 次のように展開されます: 85 86 // #cgo LDFLAGS: -L/go/src/foo/libs -lfoo 87 88 Goツールが1つ以上のGoファイルで特別なインポート「C」を使用することを検出すると、 89 ディレクトリ内の他の非Goファイルを検索して、Goパッケージの一部としてコンパイルします。 90 .c、.s、.S、または.sxファイルはCコンパイラでコンパイルされます。 91 .cc、.cpp、または.cxxファイルはC ++コンパイラでコンパイルされます。 92 .f、.F、.for、または.f90ファイルはFortranコンパイラでコンパイルされます。 93 .h、.hh、.hpp、または.hxxファイルは別途コンパイルされませんが、 94 これらのヘッダーファイルが変更された場合、パッケージ(およびその非Goソースファイル)が再コンパイルされます。 95 他のディレクトリのファイルを変更しても、パッケージが再コンパイルされるわけではないため、 96 パッケージのすべての非Goソースコードはサブディレクトリではなく、パッケージディレクトリに保存する必要があります。 97 デフォルトのCおよびC++コンパイラは、それぞれCCおよびCXX環境変数によって変更できます。 98 これらの環境変数には、コマンドラインオプションを含めることができます。 99 100 cgoツールは常に、ソースファイルのディレクトリを含むパスでCコンパイラを呼び出します。 101 つまり、-I${SRCDIR}が常に暗示されます。これは、ヘッダーファイルfoo/bar.hが、 102 ソースディレクトリとシステムインクルードディレクトリ(または-Iフラグで指定された他の場所)の両方に存在する場合、 103 「#include <foo/bar.h>」が常に他のバージョンよりも優先してローカルバージョンを見つけることを意味します。 104 105 cgoツールは、動作が期待されるシステムでのネイティブビルドではデフォルトで有効になっています。 106 クロスコンパイル時や、CC環境変数が設定されていない場合、およびデフォルトのCコンパイラ(通常はgccまたはclang)がシステムPATHに見つからない場合は、デフォルトで無効になります。 107 goツールを実行する際にCGO_ENABLED環境変数を設定することで、デフォルトを上書きできます。 108 cgoの使用を有効にするには、1に設定し、無効にするには0に設定します。 109 goツールは、cgoが有効になっている場合、ビルド制約「cgo」を設定します。 110 特別なインポート「C」は、「//go:build cgo」と同じように「cgo」ビルド制約を意味するため、 111 cgoが無効になっている場合、Cをインポートするファイルはgoツールによってビルドされません。 112 (ビルド制約の詳細については、https://golang.org/pkg/go/build/#hdr-Build_Constraints を参照してください。) 113 114 クロスコンパイル時には、cgoが使用するCクロスコンパイラを指定する必要があります。 115 これは、make.bashを使用してツールチェーンをビルドする際に、一般的なCC_FOR_TARGETまたは 116 より具体的なCC_FOR_${GOOS}_${GOARCH}(例:CC_FOR_linux_arm)環境変数を設定することで行うことができます。 117 または、goツールを実行する際にいつでもCC環境変数を設定することができます。 118 119 C++コードに対しては、CXX_FOR_TARGET、CXX_FOR_${GOOS}_${GOARCH}、およびCXX環境変数が同様の方法で機能します。 120 121 # GoからCへの参照 122 123 Goファイル内で、GoのキーワードであるCの構造体フィールド名には、アンダースコアを前置することでアクセスできます。 124 たとえば、xが「type」という名前のフィールドを持つC構造体を指す場合、x._typeでフィールドにアクセスできます。 125 ビットフィールドやアラインメントされていないデータなど、Goで表現できないC構造体フィールドは、 126 次のフィールドまたは構造体の末尾に到達するまで、適切なパディングに置き換えられてGo構造体から省略されます。 127 128 標準のC数値型は、以下の名前で利用可能です。 129 C.char、C.schar(signed char)、C.uchar(unsigned char)、 130 C.short、C.ushort(unsigned short)、C.int、C.uint(unsigned int)、 131 C.long、C.ulong(unsigned long)、C.longlong(long long)、 132 C.ulonglong(unsigned long long)、C.float、C.double、 133 C.complexfloat(complex float)、およびC.complexdouble(complex double)。 134 C型void *は、Goのunsafe.Pointerで表されます。 135 C型__int128_tおよび__uint128_tは、[16]byteで表されます。 136 137 Goで通常はポインタ型で表されるいくつかの特別なC型は、代わりにuintptrで表されます。 138 詳細については、以下の特別なケースのセクションを参照してください。 139 140 構造体、共用体、または列挙型に直接アクセスするには、 141 C.struct_statのように、struct_、union_、またはenum_を接頭辞として付けます。 142 143 C型Tのサイズは、C.sizeof_struct_statのように、C.sizeof_Tとして利用可能です。 144 145 Goファイルで、特別な名前_GoString_のパラメータ型を持つC関数を宣言することができます。 146 この関数は、通常のGo文字列値で呼び出すことができます。 147 文字列の長さと、文字列の内容へのポインタは、C関数を呼び出すことでアクセスできます。 148 149 size_t _GoStringLen(_GoString_ s); 150 const char *_GoStringPtr(_GoString_ s); 151 152 これらの関数は、他のCファイルではなく、プリアンブルでのみ使用できます。 153 Cコードは、_GoStringPtrによって返されるポインタの内容を変更してはいけません。 154 文字列の内容には、末尾のNULバイトがない場合があることに注意してください。 155 156 一般的な場合、GoはCの共用体型をサポートしていないため、 157 Cの共用体型は同じ長さのGoバイト配列として表されます。 158 159 Goの構造体には、Cの型を埋め込むことはできません。 160 161 Goのコードは、非空のC構造体の末尾にあるサイズゼロのフィールドを参照することはできません。 162 (サイズゼロのフィールドでできる唯一の操作である)そのようなフィールドのアドレスを取得するには、 163 構造体のアドレスを取得し、構造体のサイズを加算する必要があります。 164 165 Cgoは、Cの型を同等の非公開のGoの型に変換します。 166 翻訳が非公開であるため、GoパッケージはCの型をエクスポートされたAPIで公開すべきではありません。 167 1つのGoパッケージで使用されるCの型は、別のGoパッケージで使用される同じCの型とは異なります。 168 169 任意のC関数(void関数でも)は、複数の代入コンテキストで呼び出すことができ、 170 戻り値(ある場合)とC errno変数をエラーとして取得できます(関数がvoidを返す場合は、結果値をスキップするために_を使用します)。 171 例えば: 172 173 n, err = C.sqrt(-1) 174 _, err := C.voidFunc() 175 var n, err = C.sqrt(1) 176 177 Cの関数ポインタを呼び出すことは現在サポートされていませんが、 178 Cの関数ポインタを保持するGo変数を宣言し、GoとCの間で相互に渡すことができます。 179 Cコードは、Goから受け取った関数ポインタを呼び出すことができます。 180 例えば: 181 182 package main 183 184 // typedef int (*intFunc) (); 185 // 186 // int 187 // bridge_int_func(intFunc f) 188 // { 189 // return f(); 190 // } 191 // 192 // int fortytwo() 193 // { 194 // return 42; 195 // } 196 import "C" 197 import "fmt" 198 199 func main() { 200 f := C.intFunc(C.fortytwo) 201 fmt.Println(int(C.bridge_int_func(f))) 202 // Output: 42 203 } 204 205 C言語では、固定サイズの配列として書かれた関数引数は、実際には配列の最初の要素へのポインタを必要とします。 206 Cコンパイラはこの呼び出し規約を認識して、呼び出しを適切に調整しますが、Goはできません。 207 Goでは、最初の要素へのポインタを明示的に渡す必要があります:C.f(&C.x[0])。 208 209 可変長のC関数を呼び出すことはサポートされていません。C関数ラッパーを使用することで、これを回避することができます。 210 例えば: 211 212 package main 213 214 // #include <stdio.h> 215 // #include <stdlib.h> 216 // 217 // static void myprint(char* s) { 218 // printf("%s\n", s); 219 // } 220 import "C" 221 import "unsafe" 222 223 func main() { 224 cs := C.CString("Hello from stdio") 225 C.myprint(cs) 226 C.free(unsafe.Pointer(cs)) 227 } 228 229 いくつかの特別な関数は、データのコピーを作成することによって、 230 GoとCの型の間を変換します。疑似Go定義では次のようになります。 231 232 // Go文字列からC文字列へ 233 // C文字列はmallocを使用してCヒープに割り当てられます。 234 // 解放する責任は呼び出し側にあります。たとえば、C.freeを呼び出すことで解放できます 235 // (C.freeが必要な場合はstdlib.hを含めることを忘れないでください)。 236 func C.CString(string) *C.char 237 238 // Goの[]byteスライスからCの配列へ 239 // Cの配列はmallocを使用してCヒープに割り当てられます。 240 // 解放する責任は呼び出し側にあります。たとえば、C.freeを呼び出すことで解放できます 241 // (C.freeが必要な場合はstdlib.hを含めることを忘れないでください)。 242 func C.CBytes([]byte) unsafe.Pointer 243 244 // C文字列からGo文字列へ 245 func C.GoString(*C.char) string 246 247 // 明示的な長さを持つCデータからGo文字列へ 248 func C.GoStringN(*C.char, C.int) string 249 250 // 明示的な長さを持つCデータからGoの[]byteスライスへ 251 func C.GoBytes(unsafe.Pointer, C.int) []byte 252 253 // 特別な場合として、C.mallocはCライブラリmallocを直接呼び出すのではなく、 254 // CライブラリmallocをラップするGoヘルパー関数を呼び出しますが、 255 // nilを返さないことを保証します。Cのmallocがメモリ不足を示す場合、 256 // ヘルパー関数はプログラムをクラッシュさせます。Go自体がメモリ不足になった場合と同様です。 257 // C.mallocは失敗しないため、errnoを返す2つの結果形式はありません。 258 259 // CからGoへの参照 260 // 261 // Go関数は、Cコードで使用するために次の方法でエクスポートできます。 262 263 //export MyFunction 264 func MyFunction(arg1, arg2 int, arg3 string) int64 {...} 265 266 //export MyFunction2 267 func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...} 268 269 Cコードでは、次のように使用できます。 270 271 extern GoInt64 MyFunction(int arg1, int arg2, GoString arg3); 272 extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3); 273 274 // _cgo_export.h生成ヘッダーで見つかった、前文からコピーされたプリアンブルの後にある 275 // 複数の戻り値を持つ関数は、構造体を返す関数にマップされます。 276 277 すべてのGoの型が有用な方法でCの型にマップできるわけではありません。 278 Goの構造体型はサポートされていません。Cの構造体型を使用してください。 279 Goの配列型はサポートされていません。Cのポインタ型を使用してください。 280 281 Goのstring型の引数を取る関数は、上記で説明した _GoString_ 型のCタイプで呼び出すことができます。 282 _GoString_ 型は自動的にプリアンブルで定義されます。 283 Cコードからこの型の値を作成する方法はありません。これは、GoからCに文字列値を渡し、 284 再びGoに戻すためにのみ有用です。 285 286 ファイルで//exportを使用すると、プリアンブルに制限が設けられます。 287 2つの異なるC出力ファイルにコピーされるため、定義ではなく宣言のみを含める必要があります。 288 ファイルに定義と宣言の両方が含まれている場合、2つの出力ファイルは重複するシンボルを生成し、 289 リンカーが失敗します。これを回避するには、定義を他のファイルのプリアンブルまたはCソースファイルに配置する必要があります。 290 291 # ポインタの渡し方 292 293 Goはガベージコレクションされる言語であり、ガベージコレクタはGoメモリへのすべてのポインタの場所を知る必要があります。 294 そのため、GoとCの間でポインタを渡す際には制限があります。 295 296 このセクションでは、Goポインタという用語は、Goによって割り当てられたメモリへのポインタを意味します 297 (&演算子を使用するか、定義済みのnew関数を呼び出すことによって)。 298 Cポインタという用語は、Cによって割り当てられたメモリへのポインタを意味します(C.mallocを呼び出すことによって)。 299 ポインタがGoポインタであるかCポインタであるかは、メモリがどのように割り当てられたかによって動的に決定されます。 300 ポインタの型とは何の関係もありません。 301 302 いくつかのGoの型の値は、型のゼロ値以外に常にGoポインタを含みます。 303 これは、string、slice、interface、channel、map、およびfunction型に当てはまります。 304 ポインタ型はGoポインタまたはCポインタを保持できます。 305 配列と構造体型は、要素型によってGoポインタを含む場合と含まない場合があります。 306 以下のすべてのGoポインタに関する議論は、ポインタ型だけでなく、 307 Goポインタを含む他の型にも適用されます。 308 309 Cに渡されるすべてのGoポインタは、固定されたGoメモリを指す必要があります。 310 C関数に関数引数として渡されるGoポインタは、 311 呼び出しの期間中暗黙的に固定されたメモリを指します。 312 これらの関数引数から到達可能なGoメモリは、Cコードがアクセスできる限り固定されている必要があります。 313 Goメモリが固定されているかどうかは、そのメモリ領域の動的なプロパティであり、 314 ポインタの型とは何の関係もありません。 315 316 newを呼び出すことによって、複合リテラルのアドレスを取得することによって、またはローカル変数のアドレスを取得することによって作成されたGo値は、 317 [runtime.Pinner] を使用してメモリを固定することもできます。この型は、メモリの固定状態の期間を管理するために使用でき、 318 C関数呼び出しの期間を超えてメモリを固定することができます。メモリは複数回固定でき、 319 固定された回数と同じ回数だけ固定を解除する必要があります。 320 321 Goのコードは、ポイント先のメモリにGoポインタが含まれていない場合、 322 GoポインタをCに渡すことができます。構造体のフィールドにポインタを渡す場合、 323 問題のGoメモリはフィールドによって占有されるメモリであり、構造体全体ではありません。 324 配列またはスライスの要素にポインタを渡す場合、問題のGoメモリは 325 配列全体またはスライスのバッキング配列全体です。 326 327 Cのコードは、Goポインタが指すメモリが固定されている限り、Goポインタのコピーを保持できます。 328 329 Cのコードは、呼び出しが返された後、Goポインタのコピーを保持することはできません。 330 ただし、ポインタが指すメモリが [runtime.Pinner] で固定され、PinnerがGoポインタがCメモリに格納されている間にアンピンされない場合は、 331 Cのメモリに格納されたGoポインタを保持できます。 332 これは、Cコードが文字列、スライス、チャネルなどのコピーを保持できないことを意味します。 333 これらは [runtime.Pinner] で固定できないためです。 334 335 _GoString_ 型も [runtime.Pinner] で固定することはできません。 336 Goポインタを含むため、指すメモリは呼び出しの期間だけ固定されます。 337 _GoString_ 値はCコードによって保持されることはできません。 338 339 Cコードによって呼び出されるGo関数は、 340 ピン留めされたメモリへのGoポインタを返すことができます 341 (これは、文字列、スライス、チャネルなどを返すことはできないことを意味します)。 342 Cコードによって呼び出されるGo関数は、Cポインタを引数として取ることができ、 343 それらのポインタを介して非ポインタデータ、Cポインタ、またはピン留めされたGoポインタを格納することができます。 344 Goポインタを指すメモリにGoポインタを格納することはできません。 345 (これは、文字列、スライス、チャネルなどを格納することはできないことを意味します)。 346 Cコードによって呼び出されるGo関数は、Goポインタを取ることができますが、 347 指すGoメモリ(およびそのメモリが指すGoメモリなど)がピン留めされていることを保証する必要があります。 348 349 これらのルールは、実行時に動的にチェックされます。チェックは、GODEBUG環境変数のcgocheck設定によって制御されます。 350 デフォルトの設定はGODEBUG=cgocheck=1で、比較的安価な動的チェックが実装されています。 351 これらのチェックは、GODEBUG=cgocheck=0を使用して完全に無効にすることができます。 352 ポインタの処理の完全なチェックは、実行時間のコストがかかりますが、GODEBUG=cgocheck=2を使用して利用できます。 353 354 unsafeパッケージを使用することで、この強制を無効にすることができます。 355 もちろん、Cコードが好きなことをすることを防ぐものは何もありません。 356 ただし、これらのルールを破るプログラムは、予期しない方法で失敗する可能性があります。 357 358 runtime/cgo.Handle型は、GoとCの間で安全にGo値を渡すために使用できます。 359 詳細については、runtime/cgoパッケージのドキュメントを参照してください。 360 361 注:現在の実装にはバグがあります。GoコードはCメモリにnilまたはCポインタ(ただしGoポインタではない)を書き込むことが許可されていますが、 362 現在の実装では、Cメモリの内容がGoポインタであるように見える場合には、ランタイムエラーが発生することがあります。 363 したがって、Goコードがその中にポインタ値を格納する場合は、初期化されていないCメモリをGoコードに渡すことを避けてください。 364 Cでメモリをゼロにしてから渡してください。 365 366 # 特殊なケース 367 368 通常、Goではポインタ型で表されるいくつかの特殊なC型は、代わりにuintptrで表されます。それらには以下が含まれます: 369 370 1. Darwinの*Ref型、CoreFoundationのCFTypeRef型に根ざしています。 371 372 2. JavaのJNIインターフェースからのオブジェクト型: 373 374 jobject 375 jclass 376 jthrowable 377 jstring 378 jarray 379 jbooleanArray 380 jbyteArray 381 jcharArray 382 jshortArray 383 jintArray 384 jlongArray 385 jfloatArray 386 jdoubleArray 387 jobjectArray 388 jweak 389 390 3. EGL APIからのEGLDisplayとEGLConfigのタイプ。 391 392 これらのタイプは、Go側ではuintptrであるため、Goガベージコレクターが混乱する可能性があるためです。これらは、時には本当にポインタではなく、ポインタタイプにエンコードされたデータ構造です。これらのタイプのすべての操作はCで実行する必要があります。空のこのような参照を初期化するための適切な定数は0であり、nilではありません。 393 394 これらの特別なケースは、Go 1.10で導入されました。Go 1.9以前からの自動更新コードには、Go fixツールのcftypeまたはjniの書き換えを使用してください。 395 396 go tool fix -r cftype <pkg> 397 go tool fix -r jni <pkg> 398 399 適切な場所でnilを0に置き換えます。 400 401 EGLDisplayの場合は、Go 1.12で導入されました。Go 1.11以前のコードから自動更新するには、eglの書き換えを使用してください。 402 403 go tool fix -r egl <pkg> 404 405 EGLConfigの場合は、Go 1.15で導入されました。Go 1.14以前のコードから自動更新するには、eglconfの書き換えを使用してください。 406 407 go tool fix -r eglconf <pkg> 408 409 # cgoを直接使用する 410 411 使用法: 412 413 go tool cgo [cgoオプション] [-- コンパイラオプション] goファイル... 414 415 Cgoは、指定された入力Goソースファイルを複数の出力GoおよびCソースファイルに変換します。 416 417 パッケージのC部分をコンパイルするためにCコンパイラを呼び出す際に、コンパイラオプションは解釈されずにそのまま渡されます。 418 419 次のオプションは、cgoを直接実行する場合に使用できます。 420 421 -V 422 cgoのバージョンを表示して終了します。 423 -debug-define 424 デバッグオプション。#defineを出力します。 425 -debug-gcc 426 デバッグオプション。Cコンパイラの実行と出力をトレースします。 427 -dynimport file 428 fileがインポートするシンボルのリストを書き込みます。-dynout引数または標準出力に書き込みます。cgoパッケージをビルドするときにgo buildによって使用されます。 429 -dynlinker 430 -dynimport出力の一部として動的リンカーを書き込みます。 431 -dynout file 432 -dynimport出力をfileに書き込みます。 433 -dynpackage package 434 -dynimport出力のためのGoパッケージを設定します。 435 -exportheader file 436 エクスポートされた関数がある場合、生成されたエクスポート宣言をファイルに書き込みます。 437 Cコードはこれを#includeして宣言を見ることができます。 438 -importpath string 439 Goパッケージのインポートパス。オプションです。生成されたファイルのコメントに使用されます。 440 -import_runtime_cgo 441 設定されている場合(デフォルトで設定されています)、生成された出力でruntime/cgoをインポートします。 442 -import_syscall 443 設定されている場合(デフォルトで設定されています)、生成された出力でsyscallをインポートします。 444 -gccgo 445 gcコンパイラではなく、gccgoコンパイラ向けの出力を生成します。 446 -gccgoprefix prefix 447 gccgoで使用する-fgo-prefixオプション。 448 -gccgopkgpath path 449 gccgoで使用する-fgo-pkgpathオプション。 450 -gccgo_define_cgoincomplete 451 古いgccgoバージョン用に、cgo.Incompleteをインポートする代わりにローカルで定義します。 452 "runtime/cgo"パッケージから。 453 -godefs 454 Cパッケージ名を実際の値に置き換えたGo構文で入力ファイルを書き出します。 455 新しいターゲットをブートストラップするときにsyscallパッケージ内のファイルを生成するために使用されます。 456 -objdir directory 457 すべての生成されたファイルをディレクトリに配置します。 458 -srcdir directory 459 */ 460 package main