这是我的 Go 源代码:
package facerec
/*
#include "libs/facerec_lib.h"
*/
import "C"
// import "unsafe"
type FaceRecServiceImpl struct {
}
func (this *FaceRecServiceImpl) Compare(features1 []byte, features2 []byte) (r float64, err error) {
// TODO
result := C.sumUp(2, 3)
return float64(result), nil
}
facerec_lib.h
int sumUp(int a, int b);
facerec_lib.c
/* File facerec.c */
#include "facerec_lib.h"
int sumUp(int a, int b)
{
return a + b;
}
go build:
Roy-MacBook-Air:facerec $ go build
# xxx/facerec
Undefined symbols for architecture x86_64:
"_sumUp", referenced from:
__cgo_35aa8b5c98e0_Cfunc_sumUp in face_rec.cgo2.o
(maybe you meant: __cgo_35aa8b5c98e0_Cfunc_sumUp)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Roy-MacBook-Air:facerec$
我该如何处理这个问题?非常感谢 !
编辑
我将
facerec_lib.h
更改为 facerec_lib.c
,问题解决了,我想我必须错过 go 文件中的一些 FLAGS
,有什么提示吗? 最佳答案
如果您通过 cgo 使用 C 函数,则必须确保该函数的实现链接到您的 Go 包中。从对您问题的评论来看,情况似乎并非如此。
您可以通过两种方式解决此问题:
.c
文件放在实现该功能的包目录中。当您运行 go build
时,它将与 Go 代码一起编译并链接到您的包中。 import "C"
语句之前的注释中使用 the LDFLAGS directive。例如:// #cgo LDFLAGS: -lmylib
import "C"
关于c - Golang中C库的使用方法(v1.3.2),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31868482/