静的 Go バイナリを作成するには、CGO_ENABLED=0 と -ldflags \'-extldflags \'-static\'\' の両方が必要なのはなぜですか?

Susan Sarandon
リリース: 2024-11-01 16:08:02
オリジナル
369 人が閲覧しました

Why are both CGO_ENABLED=0 and -ldflags '-extldflags

Go での静的バイナリの作成: フラグを理解する

Docker とスクラッチをベースイメージとして使用して静的バイナリを作成しようとすると、ユーザーが作成中にエラーが発生しました。バイナリを実行しています。トラブルシューティングの結果、静的バイナリを作成するには CGO_ENABLED=0 および -ldflags '-extldflags "-static"' の使用が必要であることが判明しました。なぜこれらのフラグが両方とも必要なのかという疑問が生じます。

'-a' フラグ

-a フラグは、すでに最新のパッケージの再構築を強制するために使用されます。このコンテキストでは、指定されたフラグを使用してすべての依存関係が確実に再構築されます。

'-ldflags' Flag

-ldflags フラグは、go ツール リンク、ツールに渡す追加の引数を指定します。 Go ソース コードをバイナリにリンクする責任があります。 '-extldflags "-static"' 引数は、リンカーに動的リンクの代わりに静的リンクを使用するように指示します。静的リンクにより、必要なライブラリがすべてバイナリに埋め込まれ、実行時の外部依存関係が不要になります。

CGO_ENABLED=0

CGO、または Cgo パッケージを使用すると、Go プログラムが C と対話できるようになります。コード。 CGO_ENABLED=0 で CGO を無効にすると、コンパイラはリンク用の C コードを生成できなくなります。 CGO で生成されたコードには共有ライブラリへの依存関係が含まれ、バイナリが非静的になる可能性があるため、これは静的バイナリを作成する場合に重要です。

フラグの組み合わせ

CGO_ENABLED=0 と -ldflags の組み合わせ「-extldflags "-static"」は必須です

  • CGO_ENABLED=0 は C コードが生成されないことを保証し、共有ライブラリへの潜在的な依存関係を排除します。
  • -ldflags '-extldflags "-static"' はリンカーに次のことを指示します。静的リンクを使用し、必要なライブラリをすべて埋め込みます。 binary.

これらのフラグを組み合わせることで、実行時に外部ライブラリに依存しない静的バイナリを作成するという目標を達成します。

以上が静的 Go バイナリを作成するには、CGO_ENABLED=0 と -ldflags \'-extldflags \'-static\'\' の両方が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート