Я хотел бы назвать функцию go fun из функционального пространства C, но программа выдает ошибку сборки.cgo: Неопределенные символы для архитектуры x86_64
example.go
package main
/*
#include "test.c"
*/
import "C"
import "fmt"
func Example() {
fmt.Println("this is go")
fmt.Println(C.GoString(C.myprint(C.CString("go!!"))))
}
// export receiveC (remove the extra space between // and export)
func receiveC(msg *C.char) {
fmt.Println(C.GoString(msg))
}
func main() {
Example()
}
test.c
#include <stdio.h>
extern void receiveC(char *msg);
char* myprint(char *msg) {
receiveC(msg); // calling the exported go function
return msg;
}
Когда я выполнить команду для запуска/сборки (go build
или go run example.go
или go build example.go
) программу, он выдает ошибку:
# github.com/subh007/goodl/cgo
Undefined symbols for architecture x86_64:
"_receiveC", referenced from:
_myprint in example.cgo2.o
__cgo_6037ec60b2ba_Cfunc_myprint in example.cgo2.o
_myprint in test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Я следую за cgo slides для написания программы. Пожалуйста, дайте мне знать о каких-либо ошибках здесь.
Редактировать 1: Я использую OS-X 10.9 OS.
Edit2: У меня есть одно дополнительное пространство между // export
, не должно быть никакого пространства между //
и export
. Но теперь я получаю следующее сообщение об ошибке во время строительства:
# github.com/subh007/goodl/cgo
duplicate symbol _myprint in:
$WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o
$WORK/github.com/subh007/goodl/cgo/_obj/example.cgo2.o
duplicate symbol _receiver_go in:
$WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o
$WORK/github.com/subh007/goodl/cgo/_obj/example.cgo2.o
duplicate symbol _myprint in:
$WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o
$WORK/github.com/subh007/goodl/cgo/_obj/test.o
duplicate symbol _receiver_go in:
$WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o
$WORK/github.com/subh007/goodl/cgo/_obj/test.o
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Или еще проще: https://github.com/golang/go/wiki/cgo#global-functions. Слайды, на которые вы ссылаетесь, очень старые и больше не применимы. – JimB
thaks @JimB, это очень полезная ссылка. –
Получите еще одну проблему с этим образцом: ** Неопределенные символы для архитектуры x86_64: «_myprint», на которые ссылаются: ... **. Не понимаю, почему я получаю эту ошибку, кажется, что все включено нормально. – zgcharley