>  기사  >  백엔드 개발  >  GCCGO를 사용하여 내 C 프로그램에서 Go 함수를 어떻게 호출할 수 있나요?

GCCGO를 사용하여 내 C 프로그램에서 Go 함수를 어떻게 호출할 수 있나요?

DDD
DDD원래의
2024-10-26 16:21:02414검색

How can I Call Go Functions from My C Program Using GCCGO?

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 파일에 주요 기능이 포함되어 있지 않습니다.
  • C 프로그램이 자체 주요 기능을 정의합니다.

추가 옵션

라이브러리 참조 누락과 관련된 링커 오류를 해결하려면 다음 옵션을 시도하십시오.

  • --static-libgo: 정적 버전 사용 Go 라이브러리의
  • -static: 공유 라이브러리 대신 정적 라이브러리에 대한 링크.
  • -Wl,-R,/path/to/libgo.so's_folder: 경로를 지정합니다. libgo.so가 포함된 폴더.

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(&amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.