繁体   English   中英

Golang 使用 cgo 从共享 c 库调用函数

[英]Golang call functions from shared c library using cgo

我对更底层的编程语言还很陌生,如果答案很明显,我很抱歉。

对于一个项目,我需要导入一个共享库(sdk.so)并调用它的函数。 使用nm -D /lib/sdk.so --defined-only我可以查看导出的函数,所以我知道它们存在。

现在我想调用某些函数,所以我加载了库:

package main

// #cgo LDFLAGS: -ldl
// #include <stdlib.h>
// #include <dlfcn.h>

import "C"

import (
    "errors"
    "fmt"
    "log"
    "unsafe"
)

libName := "sdk"

libName := C.CString(name)
defer C.free(unsafe.Pointer(libName))

handle := C.dlopen(libName, C.RTLD_LAZY)

if handle == nil {
    return nil, ErrSoNotFound
}

sym := C.CString("some_function")
defer C.free(unsafe.Pointer(sym))

someFunction := C.dlsym(handle, sym)
if mdpSdkAlloc == nil {
    log.Fatal(ErrSoFunctionNotFound)
}

fmt.Println(someFunction)

但现在我被卡住了,不知道如何调用 function。 Println 打印出类似 0x7f50a5f9cec0 的内容,带有 & 符号我得到类似 0xc0000b2018 的内容,并且带有星号我得到“someFunction 的无效间接(类型 unsafe.Pointer)”。 我怎样才能将它转换为 function 调用?

谢谢你的帮助。

您必须在 /* */import "C" 部分中定义指向 function 的指针。 然后您可以使用 dlsym 调用的结果初始化指针。 然后你可以调用你的 function 像 C.your_function(...一些参数)。

顺便说一句,你可以尝试使用我的 go-dl package 来简化它https://github.com/sudachen/go-dl

go-dl 使用可以找到共享库的位置的声明性规范。 例如,我们想在系统库中搜索共享库,一些自定义位置,然后如果没有找到下载和/或从缓存加载。

   so := dl.Load(
       // firstly do search for system libraries
        dl.System("libsdk.so"),
       // then in the some custom place, 
       // it can be specified many times for different places
        dl.Custom("/opt/sdk/libsdk.so"), 
       // in download cache
        dl.Cached("sdk/sdk.so"), 
       // if nothing found download to cache and use cache
        dl.LzmaExternal(urlbase+"sdk.so.xz"))  

但是,您仍然必须定义 C function 指针以通过 SO.Bind(...) 方法绑定库符号。 尝试查看测试以获取有关如何使用它的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM