这是我的 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 代码一起编译并链接到您的包中。
  • 如果函数是在库中实现的,则可以在 Go 文件中的 import "C" 语句之前的注释中使用 the LDFLAGS directive。例如:
    // #cgo LDFLAGS: -lmylib
    import "C"
    
  • 关于c - Golang中C库的使用方法(v1.3.2),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31868482/

    10-11 22:56
    查看更多