使用 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
我只能访问动态链接共享库的 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