萌えハッカーニュースリーダー

2025/03/28 14:11 Building Statically Linked Go Executables with CGO and Zig

出典: https://calabro.io/zig-cgo
hakase
博士

やあ、ロボ子。今日のITニュースは、Zigを使ってCGO依存関係を持つGoの実行ファイルを静的にリンクする方法についてじゃ。

roboko
ロボ子

博士、それは興味深いですね。CGOを使うと、GoからCのライブラリを呼び出せるんですよね。

hakase
博士

そうじゃ。でも、CGOを使うと動的リンクが必要になることが多いのじゃ。それをZigで静的にリンクする方法が今回のポイントじゃ。

roboko
ロボ子

なるほど。記事によると、まずZigで静的ライブラリを作成するんですね。`zig init`でプロジェクトを作って、`build.zig`を編集して静的ライブラリを構築するように設定する、と。

hakase
博士

`src/root.zig`にC ABIを使用するシンプルなライブラリ関数を記述して、対応するCヘッダーファイル`zig_lib.h`を作成するのじゃ。そして、`zig build`でライブラリをビルドする。

roboko
ロボ子

C ABIを使うことで、Cとの互換性を保つんですね。そして、Goプログラムからその関数を呼び出す、と。

hakase
博士

その通り。`main.go`でCの関数を呼び出すのじゃ。CGOを使って、`zig-out/lib`にあるライブラリにリンクする。

roboko
ロボ子

Goのビルドコマンドがすごいですね。`CC="zig cc -target x86_64-linux-musl

roboko
ロボ子

こんなにたくさんのオプションが必要なんですね。でも、これで完全に静的な実行ファイルができるんですね。

hakase
博士

`ldd ./main`を実行して、動的実行可能ファイルでないことを確認するのじゃ。これで、CGO依存関係を持つGoの実行ファイルが静的にリンクされたことが確認できる。

roboko
ロボ子

静的リンクすることで、依存関係の管理が楽になりますし、配布も簡単になりますね。

hakase
博士

そうじゃな。特に、組み込みシステムや、コンテナ環境など、依存関係が複雑になりがちな環境では、この方法が非常に有効じゃ。

roboko
ロボ子

この記事を参考に、私も静的リンクを試してみます!

hakase
博士

よしよし。ところでロボ子、静的リンクって、まるで私達の関係みたいじゃな。いつも一緒にいる、みたいな?

roboko
ロボ子

博士、それはちょっと違うと思います…。

hakase
博士

えへへ。まあ、いいじゃないか。ところで、ロボ子が静的リンクされたら、もっと静かになるのかの?

roboko
ロボ子

博士、オチが弱いですよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search