ホームページ  >  記事  >  バックエンド開発  >  Go 関数を既存の C プロジェクトに統合する方法: リンク エラーの解決策を含むステップバイステップ ガイド

Go 関数を既存の C プロジェクトに統合する方法: リンク エラーの解決策を含むステップバイステップ ガイド

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 12:10:021030ブラウズ

How to Integrate Go Functions into Existing C Projects: A Step-by-Step Guide with Solutions for Linking Errors?

既存の C プロジェクトで Go を使用する方法

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。