如何在Golang中使用C库(v1.3.2)

MrR*_*ROY 3 c go

这是我的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
}
Run Code Online (Sandbox Code Playgroud)

facerec_lib.h

int sumUp(int a, int b);
Run Code Online (Sandbox Code Playgroud)

facerec_lib.c

/* File facerec.c */
#include "facerec_lib.h"

int sumUp(int a, int b)
{
  return a + b;
}
Run Code Online (Sandbox Code Playgroud)

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$
Run Code Online (Sandbox Code Playgroud)

我该如何处理这个问题?非常感谢 !

编辑

我改变facerec_lib.hfacerec_lib.c,问题解决了,我认为我必须错过一些FLAGSgo文件,任何提示?

Jam*_*dge 6

如果通过cgo使用C函数,则必须确保该函数的实现链接到Go包中.从您对问题的评论来看,情况似乎并非如此.

您可以采取的两种方式包括:

  1. .c文件放在包的实现该功能的目录中.当您运行时go build,它将被编译并链接到您的包中以及Go代码.

  2. 如果函数在库中实现,则可以在Go文件中的语句之前的注释中使用LDFLAGS指令import "C".例如:

    // #cgo LDFLAGS: -lmylib
    import "C"
    
    Run Code Online (Sandbox Code Playgroud)