Docker とスクラッチをベースイメージとして使用して静的バイナリを作成しようとすると、ユーザーが作成中にエラーが発生しました。バイナリを実行しています。トラブルシューティングの結果、静的バイナリを作成するには CGO_ENABLED=0 および -ldflags '-extldflags "-static"' の使用が必要であることが判明しました。なぜこれらのフラグが両方とも必要なのかという疑問が生じます。
-a フラグは、すでに最新のパッケージの再構築を強制するために使用されます。このコンテキストでは、指定されたフラグを使用してすべての依存関係が確実に再構築されます。
-ldflags フラグは、go ツール リンク、ツールに渡す追加の引数を指定します。 Go ソース コードをバイナリにリンクする責任があります。 '-extldflags "-static"' 引数は、リンカーに動的リンクの代わりに静的リンクを使用するように指示します。静的リンクにより、必要なライブラリがすべてバイナリに埋め込まれ、実行時の外部依存関係が不要になります。
CGO、または Cgo パッケージを使用すると、Go プログラムが C と対話できるようになります。コード。 CGO_ENABLED=0 で CGO を無効にすると、コンパイラはリンク用の C コードを生成できなくなります。 CGO で生成されたコードには共有ライブラリへの依存関係が含まれ、バイナリが非静的になる可能性があるため、これは静的バイナリを作成する場合に重要です。
CGO_ENABLED=0 と -ldflags の組み合わせ「-extldflags "-static"」は必須です
これらのフラグを組み合わせることで、実行時に外部ライブラリに依存しない静的バイナリを作成するという目標を達成します。
以上が静的 Go バイナリを作成するには、CGO_ENABLED=0 と -ldflags \'-extldflags \'-static\'\' の両方が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。