使用 CGO 动态获取正确的 OS 和处理器架构

Dynamically pickup the correct OS and processor architecture using CGO

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

以下是我将库与 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 架构上运行。

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

我试过像下面这样的文件夹结构

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

并修改LDFLAGS如下

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

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

有没有办法实现这个动态库拾取功能?

你能有:

library_darwin.go

library_linux.go

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

根据目标 OS,go 将只构建正确的文件(参见 here

通过查看它自己的 go 源代码,找到了一种无需创建多个文件即可实现此目的的简单方法 cgo

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

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

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