ホームページ >バックエンド開発 >Golang >Go コードを既存の C プロジェクトに統合するにはどうすればよいですか?

Go コードを既存の C プロジェクトに統合するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-17 18:48:13477ブラウズ

How Can I Integrate Go Code into My Existing C Project?

Go コードを既存の C プロジェクトに統合する

質問:
Go コードを呼び出すことは可能ですか? C プログラムからのものです。そうであれば、どのようにしてこれを行うことができますか?達成されましたか?

答え:
はい、Go 1.5 では -buildmode=c-archive モードが導入されました。これにより、Go コードを C プログラムへのリンクに適したアーカイブにコンパイルできるようになります。 Go コードを既存の C プロジェクトに統合するには:

  1. 関数をエクスポート用にマーク:

    • C から呼び出される関数は次のとおりです。 Go コードでは //export コメントでマークされています。
    • これらの関数を含む Go パッケージの名前が付けられていることを確認してください。 main.
    • 空の場合でも main という名前の関数を含めます。
    • C パッケージをインポートします。
  2. コンパイル行くアーカイブ:

    • 次のコマンドを使用して Go コードを C 呼び出し可能な静的ライブラリにコンパイルします:

      go build -buildmode=c-archive foo.go
    • これによりアーカイブが生成されますおよびヘッダー ファイル (例: foo.a とfoo.h).
  3. リンク C プログラム:

    • C プログラムに、生成されたヘッダファイル:

      #include "foo.h"
    • リンク-pthread オプションを使用して Go アーカイブに対して:

      gcc -pthread foo.c foo.a -o foo
    • これにより、C プログラムがエクスポートされた Go 関数を呼び出すことができるようになります。

例:

次の Go コードを考えてみましょう。 (foo.go):

package main

import "C"
import "fmt"

//export PrintInt
func PrintInt(x int) {
    fmt.Println(x)
}

func main() {}

アーカイブにコンパイルします:

go build -buildmode=c-archive foo.go

次に、C プログラム (foo.c):

#include "foo.h"

int main(int argc, char **argv) {
    PrintInt(42);
    return 0;
}

コンパイルします:

gcc -pthread foo.c foo.a -o foo

foo を実行すると出力されます「42」。

以上がGo コードを既存の C プロジェクトに統合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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