在Golang应用程序中使用cgo无法使用已编译的C库吗?

时间:2016-08-31 13:30:40

标签: c go shared-libraries cgo

我正在尝试在Golang中包装一个C库。我试图在已编译的库中调用C函数。我有一个.a文件和一个.so库文件。

我需要在哪里放置库文件?如何告诉cgo我正在使用这些库?

对于C来说,我是一个新手。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

我将用这个样本解释它:

首先使用libhello.a构建./libs/m.c

#include <stdint.h> 

extern uint64_t Add(uint64_t a, uint64_t b) {
    return a + b;
}

对于此测试样本,libhello.a位于./libs/内:

m.go
└───libs
    m.c
    libhello.a

然后go build这个m.go工作样本:

package main

//#cgo LDFLAGS: -L${SRCDIR}/libs -lhello
//#include <stdint.h>
//extern uint64_t Add(uint64_t a, uint64_t b);
import "C"

import (
    "fmt"
)

func main() {
    fmt.Println(C.Add(C.uint64_t(10), C.uint64_t(20))) // 30
}

输出:

30
  

解析cgo指令时,会出现任何字符串   $ {SRCDIR}将被目录的绝对路径替换   包含源文件。这允许预编译的静态库   要包含在包目录中并正确链接。对于   例如,如果包foo位于目录/ go / src / foo:

// #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
     

将扩展为:

// #cgo LDFLAGS: -L/go/src/foo/libs -lfoo