cgo : 未定义的体系结构符号 x86_64
cgo : Undefined symbols for architecture x86_64
我想从 C 函数中调用 go func space,但是程序抛出构建错误。
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;
}
当我对run/build(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写程序。如有任何错误,请告诉我。
Edit1:我正在使用 OS-X 10.9 OS。
编辑2:
我在// export
之间多了一个space,//
和export
之间应该没有space。但是现在我在构建时遇到以下错误:
# 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)
生成了重复的符号,因为我已经将 test.c
直接包含到 go 文件中。所以符号被包含了两次。
我认为,这段代码的正确写法是(如有错误请评论):
定义头文件(test.h):
#ifndef TEST_H_
#define TEST_H_
char* myprint(char *msg);
#endif
定义实现文件(test.c):
#include <stdio.h>
#include "test.h"
extern void receiveC(char *msg);
char* myprint(char *msg) {
receiveC(msg);
return msg;
}
将 .h
文件包含到 go
文件 (example.go) :
package main
/*
#include "test.h"
*/
import "C"
import "fmt"
func Example() {
fmt.Println("this is go")
fmt.Println(C.GoString(C.myprint(C.CString("go!!"))))
}
// make sure that there should be no space between the `//` and `export`
//export receiveC
func receiveC(msg *C.char) {
fmt.Println(C.GoString(msg))
}
func main() {
Example()
}
构建程序:
go build
运行 生成的可执行文件(生成的可执行文件带有 cgo
名称,需要一些调查才能找到原因)。
$./cgo
我想从 C 函数中调用 go func space,但是程序抛出构建错误。
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;
}
当我对run/build(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写程序。如有任何错误,请告诉我。
Edit1:我正在使用 OS-X 10.9 OS。
编辑2:
我在// export
之间多了一个space,//
和export
之间应该没有space。但是现在我在构建时遇到以下错误:
# 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)
生成了重复的符号,因为我已经将 test.c
直接包含到 go 文件中。所以符号被包含了两次。
我认为,这段代码的正确写法是(如有错误请评论):
定义头文件(test.h):
#ifndef TEST_H_ #define TEST_H_ char* myprint(char *msg); #endif
定义实现文件(test.c):
#include <stdio.h> #include "test.h" extern void receiveC(char *msg); char* myprint(char *msg) { receiveC(msg); return msg; }
将
.h
文件包含到go
文件 (example.go) :package main /* #include "test.h" */ import "C" import "fmt" func Example() { fmt.Println("this is go") fmt.Println(C.GoString(C.myprint(C.CString("go!!")))) } // make sure that there should be no space between the `//` and `export` //export receiveC func receiveC(msg *C.char) { fmt.Println(C.GoString(msg)) } func main() { Example() }
构建程序:
go build
运行 生成的可执行文件(生成的可执行文件带有
cgo
名称,需要一些调查才能找到原因)。$./cgo