2014-04-19 2 views
3

나는 이것을 할 수있는 많은 다른 방법을 보았으며, 그들 중 아무 것도 많은 래퍼와 콜백을 사용하지 않는 것이 이상적이라고 생각하지 않는다. 이 작업을 수행하는 간단한 방법이 있습니까?현재 C에서 Go 함수를 호출 할 수있는 메소드는 무엇입니까?

//foo.go 

package foo 

import "C" 

//export SayFive 
func SayFive() int { 
    return 5 
} 

이 지금 최소까지 제거되어, 나는이 시점에서 할 수 있기를 원하는 모든 C.

에서 호출이 SayFive 기능입니다 :

예를 들어, 우리는이 가지고

그러나이 파일의 맨 위에는 없습니다. 그것은 그렇게 할 수있는 것은 매우 간단하고 유용하지만이 같은 방법을 찾고 있어요 :

//foo.c 

#include <stdio.h> 

int main() { 
    int a = SayFive(); 
} 

내가 위처럼 예에서 본 적이 총 의미가 #include "_cgo_export.h",하지만 내가 그것을했을 때 그것을 컴파일하려고하면, 그것은 실패합니다.

누구든지이 작업을 수행 할 수있는 전체 프로세스를 설명 할 수 있습니까?

답변

4

C에서 Go 및 Go로 C를 호출 할 수 있지만 으로 Go 프로그램의 프레임 워크 내에서 호출 할 수 있습니다.

main()이있는 C 프로그램의 예제는 C 프로그램의 프레임 워크에서 Go를 호출하기 때문에 작동하지 않습니다.

즉, Go는 정적 또는 동적으로 C 프로그램과 연결할 수있는 개체를 만들 수 없습니다.

그래서 머리에 원하는 것을 돌리고 Go 프로그램을 마스터로 만들고 C 프로그램 파트를 호출해야합니다. 즉, main() 기능이있는 프로그램은 Go 프로그램이어야합니다.

희망이 맞습니다!

+0

답변 해 주셔서 감사합니다. 'go tool cgo foo.go'를 실행하면'_obj'에 C 소스 파일과 헤더를 (기본값으로) 생성 할 것입니다. 마스터 프로그램이 C로 쓰여질 수있는 방법으로 이들을 사용할 방법이 없다면? 그것은'#include "_cgo_export.h"'를 사용하는 것을 포함합니다. –

+0

매우 어렵습니다. Go 및 C 메모리 관리가 매우 다르므로 Go to 담당해야합니다. 거기에 Go 런타임을 얻는 방법에 대한 문제도 있습니다. 이것이 Go 개발자의 목표라고 생각하지 않습니다. 그래서 쉽지 않을 것입니다! –

+0

이것이 gccgo로 수행 할 수있는 유일한 방법이라고 생각합니다.하지만 gccgo를 사용하지 않고 시도하고 싶었습니다. –

관련 문제