我正在尝试在Golang中包装一个C库。我试图在已编译的库中调用C函数。我有一个.a
文件和一个.so
库文件。
我需要在哪里放置库文件?如何告诉cgo
我正在使用这些库?
对于C来说,我是一个新手。任何帮助都会非常感激。
答案 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