既存の 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.エラーへの対処:
Go 1.5 の代替解決策:
Go 1.5 (8 月リリース予定) では、新機能により Go コードから C 互換ライブラリを作成できるようになりました。この機能を使用すると、静的ライブラリまたは共有ライブラリを Go ファイルから直接構築できるため、中間オブジェクト ファイルが不要になります。
例:
main.c 内:
#include <stdio.h> int main() { char *string_to_pass = NULL; if (asprintf(&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 サイトの他の関連記事を参照してください。