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