GCCGO를 사용하여 C 프로그램에서 Go 함수 호출
소개
Go 코드 통합 기존 C 프로젝트 내에서는 Go 파일에서 개체 파일(.o)을 생성하고 이를 C 프로젝트의 아카이브(.a) 파일에 통합해야 합니다. 이 글에서는 GCCGO를 사용하여 이 작업을 수행하는 방법에 대한 자세한 설명을 제공합니다.
Go 개체 파일 만들기
Go 파일에서 개체 파일을 만들려면 gccgo를 사용하세요. 파일을 연결하지 않고 컴파일하려면 -c 옵션과 함께 명령을 사용하세요.
gccgo -c printString.go -o printString.o -fgo-prefix=print -Wall -Werror -march=native
-fgo-prefix 옵션은 Go 파일에서 내보낸 기호의 접두사를 지정합니다.
Go 함수를 C 프로그램에 연결
Go 개체 파일을 C 프로그램에 연결하려면 C 코드에서 extern 선언과 __asm__ 키워드를 사용하세요.
<code class="c">#include <stdio.h> extern int PrintString(char*) __asm__ ("print.main.PrintString");</code>
이것은 GCCGO에 대한 올바른 서명과 기호 이름을 사용하여 PrintString 함수를 선언합니다.
컴파일
C 프로그램을 Go 개체 파일로 컴파일하려면 gccgo를 -o와 함께 사용하세요. 출력 실행 파일을 지정하는 옵션:
gccgo -o main c_caller.c printString.o -Wall -Werror -march=native
컴파일 오류 해결
원래 질문에 언급된 초기 컴파일 오류는 GCCGO가 Go에서 주요 기능을 기대한다는 것을 나타냅니다. 파일. 그러나 C 프로그램에 연결하는 경우에는 이것이 필요하지 않습니다. 이 문제를 해결하려면 다음 사항을 확인하세요.
추가 옵션
라이브러리 참조 누락과 관련된 링커 오류를 해결하려면 다음 옵션을 시도하십시오.
Go 1.5의 예(2015년 8월)
Go 1.5에서는 다음을 사용하여 C 호환 라이브러리를 직접 구축하는 기능을 도입했습니다. 도구로 가세요. 이 방법은 프로세스를 크게 단순화합니다:
_main.c
<code class="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; }</code>
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 build -buildmode c-archive -o mygopkg.a gcc -o main _main.c mygopkg.a -lpthread
공유 라이브러리로 구축:
go build -buildmode c-shared -o mygopkg.so LD_RUN_PATH=$(pwd) gcc -o main _main.c mygopkg.so -lpthread
위 내용은 GCCGO를 사용하여 내 C 프로그램에서 Go 함수를 어떻게 호출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!