代码之家  ›  专栏  ›  技术社区  ›  Anuruddha

使用cgo动态获取正确的操作系统和处理器架构

  •  3
  • Anuruddha  · 技术社区  · 7 年前

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

    以下是我如何将图书馆与高朗整合在一起

    // #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/文件夹下时,这工作得非常好。

    我试图将其作为一个可获取的库,在这里它可以在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 回复  |  直到 7 年前
        1
  •  1
  •   caszi    7 年前

    你能要:

    library_darwin.go

    library_linux.go

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

    根据目标操作系统,go将只生成正确的文件(请参见 here )

        2
  •  1
  •   Anuruddha    7 年前

    通过查看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