ホームページ  >  記事  >  バックエンド開発  >  GCCGO を使用して Go 関数を既存の C プロジェクトに統合するにはどうすればよいですか?

GCCGO を使用して Go 関数を既存の C プロジェクトに統合するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 22:42:02765ブラウズ

How to Integrate Go Functions into Existing C Projects Using GCCGO?

既存の C プロジェクト内での移動の使用

背景:
複数のオブジェクトで構成される C プログラムがありますファイルはアーカイブ ファイル (.a) に保存されます。新しい Go ファイルをプロジェクトに追加し、オブジェクト ファイルにコンパイルして、既存のアーカイブに組み込む予定です。

目的:
Go 関数を C に統合するプログラム。

処理:

1. Go ファイルをオブジェクト ファイルにコンパイルします:

  • 次のコマンドを実行します:

    gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native

2. C から Go 関数を呼び出す:

  • c_caller.c ファイルで、extern 関数を宣言します。

    extern int PrintString(char*) __asm__ ("print.main.PrintString");
  • main 関数で Go 関数を呼び出し、結果を処理します。

    int result = PrintString(string_to_pass);
    if (result) { printf("Everything went as expected!\n"); }
    else       { printf("Uh oh, something went wrong!\n"); }

3. GCCGO を使用してプロジェクト全体をビルドする:

  • 次のコマンドを実行します:

    gccgo -o main c_caller.c printString.o -Wall -Werror -march=native

4.エラーへの対処:

  • 「main.main への未定義の参照」などのエラーが発生した場合は、C コードに main 関数があることを確認してください。
  • 「-lgo が見つかりません」などのエラーが発生した場合は、LD_LIBRARY_PATH 環境変数が libgo.so が存在するフォルダーを指すように設定されていることを確認してください。

Go 1.5 の代替解決策:

Go 1.5 (8 月リリース予定) では、新機能により Go コードから C 互換ライブラリを作成できるようになりました。この機能を使用すると、静的ライブラリまたは共有ライブラリを Go ファイルから直接構築できるため、中間オブジェクト ファイルが不要になります。

例:

  • main.c 内:

    #include <stdio.h>
    
    int main()
    {
      char *string_to_pass = NULL;
      if (asprintf(&amp;string_to_pass, "This is a test.") < 0) {
          printf("asprintf fail");
          return -1;
      }
    
      PrintString(string_to_pass);
      return 0;
    }
  • main.go 内 (静的または go build -buildmode c-shared の場合は go build -buildmode c-archive ... でコンパイルされます。 .. 共有ライブラリの場合):

    package main
    
    import "C"
    import "fmt"
    
    //export PrintString
    func PrintString(cs *C.char) {
      s := C.GoString(cs)
      fmt.Println(s)
    }
    
    func main() {}

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

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