使用CGO动态选择正确的操作系统和处理器架构

时间:2018-07-11 02:57:28

标签: go cgo

我只能访问动态链接的共享库的linux和darwin发行版。

以下是我如何将库与Golang集成

// #cgo LDFLAGS: -L${SRCDIR}/build -lprocessing_lib
// #include "Processing-bridge.h"
// #include <stdlib.h>
import "C"
import "unsafe"

type ProcessorWrapper struct {
    ptr unsafe.Pointer
}

func init() {
    pr.ptr = C.NewProcessor()
}

func GetDefault() (id int, name string) {
    var default = C.GetDefault(pr.ptr)
    id = int(default.materialId)
    name = C.GoString(default.name)
    return
}

当我将匹配的库复制到build /文件夹下时,这工作得很好。

我试图将其作为go gettable库,它可以在linux和darwing架构上运行。

我遇到的问题是告诉go编译器为匹配的GOOS和GOARCH选择正确的库。

我尝试使用以下文件夹结构

build/darwing/libprocessing_lib.so
build/linux/libprocessing_lib.so

并如下修改了LDFLAGS

// #cgo LDFLAGS: -L${SRCDIR}/build/${GOOS} -lprocessing_lib

但是它不能识别$ {GOOS}并用正确的值替换。

是否可以实现此动态库提取功能?

2 个答案:

答案 0 :(得分:1)

您可以:

library_darwin.go

library_linux.go

在每个文件中,都有正确的#cgo标志(但代码相同)吗?

根据目标操作系统,go只会构建正确的文件(请参见here

答案 1 :(得分:1)

通过查看自身的go源代码cgo

,找到了一种无需创建多个文件即可实现此目标的简便方法
// #cgo darwin LDFLAGS: -L${SRCDIR}/build/darwin -lprocessing_lib
// #cgo linux LDFLAGS: -L${SRCDIR}/build/darwin -lprocessing_lib

如果需要,我们也可以通过架构,如下所示

// #cgo darwin,arm64 LDFLAGS: -L${SRCDIR}/build/darwin -lprocessing_lib