Go 関数を C プログラムに統合する
Go 関数を C プログラムに統合するこれには、Go ファイルをオブジェクト ファイル (.o) にビルドし、それを既存の C プロジェクトのアーカイブ (.a) ファイルに組み込むことが含まれます。これにより、C プログラム内から Go 関数を呼び出すことができます。
サンプル コードで発生した問題
ユーザーが提供したサンプルでは、リンク フェーズ中のエラーが示されています。これらのエラーは、C プログラムとは異なり、GCCGO が Go ファイルに main 関数を期待しているという誤解から生じています。
Go 1.5 以降での解決策
Go 1.5 以降それ以降のバージョンでは、この問題は解決されています。 Go ツールを使用して C 互換ライブラリを構築できるようになります。この機能を使用すると、ユーザーは質問に示されているように C ファイル (main.c) を保持し、次のように Go ファイル (main.go) を更新できます。
<code class="go">package main import "C" import "fmt" //export PrintString func PrintString(cs *C.char) { s := C.GoString(cs) fmt.Println(s) } func main() {}</code>
Go のビルドオブジェクト ファイル
Go ファイルをオブジェクト ファイルにビルドするには、次のコマンドを実行します:
go build -buildmode c-archive -o mygopkg.a
C プロジェクトへの統合
Go オブジェクト ファイルを C プログラム (_main.c) にリンクするには、次のコマンドを使用して最終バイナリをビルドします:
gcc -o main _main.c mygopkg.a -lpthread
共有ライブラリの代替アプローチ
Go で共有ライブラリを構築したい場合は、次のコマンドで mygopkg.so が作成されます:
go build -buildmode c-shared -o mygopkg.so
共有ライブラリを _main.c にリンクするには、次のコマンドを実行します:
LD_RUN_PATH=$(pwd) gcc -o main _main.c mygopkg.so -lpthread
注: ランタイム中にリンカーが現在のディレクトリで共有ライブラリを確実に見つけるには、LD_RUN_PATH を設定します。
詳細と洞察については、Go 実行モード設計ドキュメントを参照してください。 .
以上がGo 関数を既存の C プロジェクトに統合する方法: リンク エラーの解決策を含むステップバイステップ ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。