>백엔드 개발 >Golang >c golang을 호출하는 방법

c golang을 호출하는 방법

WBOY
WBOY원래의
2023-05-13 11:27:38803검색

C 언어와 Golang은 모두 일반적으로 사용되는 프로그래밍 언어입니다. 구문과 응용 시나리오가 다르지만 둘 다 고유한 장점과 단점이 있으므로 응용 프로그램 요구 사항에 따라 서로 다른 프로그래밍 언어가 선택됩니다. 하지만 C 언어와 Golang을 통합하려면 두 언어 간의 상호 운용성을 달성하는 방법을 이해해야 합니다.

이 글에서는 C 언어로 Golang 프로그램을 호출하는 방법을 소개하겠습니다. C 언어는 초기 프로그래밍 언어로 시스템 개발에 널리 사용되는 반면, Golang은 효율적인 동시성 성능으로 선호되는 최신 프로그래밍 언어입니다. 두 가지를 통합하면 각각의 장점을 고려하고 더 풍부한 기능을 갖춘 애플리케이션을 구현할 수 있습니다.

Prerequisites

C 언어로 Golang을 호출하기 전에 Golang이 환경에 설치되어 있는지 확인해야 합니다. 터미널에서 다음 명령어를 입력하여 확인할 수 있습니다.

$ go version

Golang 버전 정보가 터미널에 출력되면 설치가 성공한 것입니다.

Go 함수 호출

Golang은 C 프로그램에서 직접 사용할 수 있는 C 언어 호환 API를 제공합니다. 이 API를 사용하여 C 프로그램에서 Golang 함수를 호출할 수 있습니다. 단계는 다음과 같습니다.

  1. 먼저 Golang 함수를 정의할 때 함수 이름 앞에 //export를 추가해야 합니다. 이는 C 프로그램에 대한 기능적 인터페이스를 노출합니다.
package main

import "C"

//export Add
func Add(x, y int) int {
    return x + y
}
//export 。这样可以将函数接口暴露给C程序。
typedef struct {
    uintptr_t p;
} GoInt;

typedef struct {
    uintptr_t p;
    int n;
} GoString;

typedef struct {
    uintptr_t p;
    int n;
} GoSlice;

typedef struct {
    uintptr_t p;
    uintptr_t len;
    uintptr_t cap;
} GoSliceHeader;

typedef struct {
    uintptr_t p;
    uintptr_t len;
} GoStringHeader;

typedef struct {
    uintptr_t p;
    int argc;
    void *argv;
} GoArgs;

typedef struct {
    uintptr_t p;
    int type; /* 0 = panic, 1 = error */
    char *message;
} GoError;

typedef int (*AddFunc)(int, int);

AddFunc NewAddFunc() {
    static GoInt Add;
    static int once = 1;
    if (once) {
        once = 0;
        // Call the "Add" function implemented in Go
        const char* name = "Add";
        void* symbol = dlsym(RTLD_DEFAULT, name);
        if (symbol == NULL) {
            return NULL;
        }
        Add.p = (uintptr_t)symbol;
    }
    return (AddFunc)Add.p;
}

在这个例子中,我们定义了一个Add函数,接受两个整数并返回它们的和。通过//export命令,我们将这个函数的接口暴露给了C程序。

  1. 接下来,我们需要在C程序中定义一个函数指针,用于保存我们调用Golang函数时的句柄。
int main() {
    AddFunc add = NewAddFunc();
    if (add == NULL) {
        printf("Failed to find 'Add' function.
");
        return -1;
    }
    int result = add(1, 2);
    printf("The result is %d.
", result);
    return 0;
}
  1. 现在我们就可以利用函数指针调用Golang函数Add了。
$ gcc -o cgo_example cgo_example.c -Wl,-rpath,$GOPATH/src/github.com/YourUserName/YourProjectName

在这个例子中,我们定义了NewAddFunc来获取Add函数的函数指针。如果没有成功获取到函数指针,则输出一条错误信息,并退出程序。如果获取到了函数指针,则我们可以直接通过它来调用Add函数,输入两个整数参数,并通过printf이 예에서는 두 개의 정수를 받아들이고 그 합계를 반환하는 Add 함수를 정의합니다. //export 명령을 통해 이 함수의 인터페이스를 C 프로그램에 노출합니다.

    다음으로 Golang 함수를 호출할 때 핸들을 저장하기 위해 C 프로그램에서 함수 포인터를 정의해야 합니다.

rrreee
    이제 함수 포인터를 사용하여 Golang 함수 Add를 호출할 수 있습니다.
rrreee

이 예에서는 Add 함수의 함수 포인터를 가져오기 위해 NewAddFunc를 정의합니다. 함수 포인터를 성공적으로 얻지 못하면 오류 메시지가 출력되고 프로그램이 종료됩니다. 함수 포인터를 얻으면 이를 통해 Add 함수를 직접 호출하고, 두 개의 정수 매개변수를 입력하고, printf 함수를 통해 계산 결과를 출력할 수 있습니다.

참고: 컴파일하기 전에 컴파일된 프로그램이 Golang 라이브러리에 올바르게 링크될 수 있도록 다음 매개변수를 명령줄에 추가해야 합니다.

rrreee🎜결론🎜🎜위 단계를 통해 다음에서 쉽게 호출할 수 있습니다. C 프로그램의 Golang 기능을 통해 기존 C 프로그램에서는 구현하기 어려운 기능을 구현합니다. 동시에 우리는 이 프로세스를 수행할 때 올바른 데이터 전송과 올바른 유형 일치를 보장하기 위해 함수 포인터와 데이터 구조를 정의해야 한다는 점도 확인했습니다. 실제 적용에서는 실제 상황에 따라 유연하게 조정하고 수정해야 합니다. 🎜

위 내용은 c golang을 호출하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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