>  기사  >  백엔드 개발  >  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 함수가 있는지 확인하세요.
  • 발생하는 경우 "cannot find -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-archive ... for static 또는 go build -buildmode c-shared 로 컴파일). .. 공유 라이브러리의 경우):

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

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