如何在Go中调用linux共享库函数?

2023-11-23

我有一个 .so 文件,我想在 Go 代码中调用其函数。

我该如何去做呢?我已经阅读了 cgo 和 syscall 包。它们接近我想要的,但我没有看到任何可以调用 .so 文件中的函数的地方。

我想完全实现 ctypes 包在 Python 中的功能。

有人可以帮忙吗?


如果您想使用在编译时静态已知的共享库,您可以简单地使用cgo。请阅读有关如何准确执行此操作的文档,但通常您会指定一些链接器标志和几行注释掉的行。这是一个如何调用函数的示例bar() from libfoo.so.

package example

// #cgo LDFLAGS: -lfoo
//
// #include <foo.h>
import "C"

func main() {
    C.bar()
}

您还可以使用 cgo 访问在运行时动态加载的共享对象。您可以使用dlopen(), dlsym(), and dlclose()打开一个共享库,检索其中函数之一的地址,最后关闭该库。请注意,您无法在 Go 中执行这些操作,您必须在 C 中编写一些包装器代码来为您实现必要的逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Go中调用linux共享库函数? 的相关文章

  • RuntimeError:使用 docker 关闭连接后无法重用套接字

    我正在关注本教程 https github com getamis eth indexer blob master README md fbclid IwAR3g3SAjJ9ik hHCFkol2k8YXo0GvBL15oSNC hIU38
  • 记录到 golang 中的文件

    我从 golang 开始 当我开始构建我的应用程序时 我想从一开始就添加日志记录 这就是我遇到问题的地方 如果我打开一个文件并使用标准日志记录库 我就可以写入文件 就像这样 package main import os fmt log fu
  • 如何展平嵌套 JSON

    尝试将嵌套的 json 响应从 2 层深度压平到 1 层 这是我在 Go Playground 上的工作代码 http play golang org p kHAYuZUTko http play golang org p kHAYuZUT
  • Golang - 如何在特定时间执行函数

    我需要在一天中的特定时间运行一个函数 例如 0010 0610 1210 1810 我目前的方法使用自动收报机for range time Tick 21600 time Second 我以这些时间间隔之一 例如 1210 手动启动该程序
  • 如何在 Go 中解组可以是数组或字符串的字段?

    我正在尝试解组该文件 babel email protected cdn cgi l email protection licenses MIT repository https github com babel babel tree ma
  • 使用 Go 解组嵌套 xml

    我有以下代码片段 我一直在努力让它工作 我到处寻找解决方案 但我找到的解决方案似乎都不起作用 我的映射似乎有问题xml Unmarshal命令 因为它涉及嵌套字段 下面的代码用于检索第一个被称为的值unit 并且位于 xml 代码的顶层 另
  • Golang xml.Unmarshal 接口类型

    使用xml我在解组非同质类型列表时遇到问题 考虑以下 XML 文档 其嵌套元素是非同质类型的列表
  • 如何获取变量的内存大小?

    有谁知道如何获取变量的内存大小 int string struct等 并打印它 是否可以 var i int 1 I want to get something like this fmt Println Size of i is i Al
  • Golang:获取切片的类型

    我正在使用 Reflect 包来获取任意数组的类型 但是得到 prog go 17 cannot use sample array1 type int as type interface in function argument proce
  • 如何让供应商与 Google App Engine 配合使用?

    我正在尝试引入 Go 供应商 将依赖项存储在名为的文件夹中 vendor 到现有的 App Engine 项目 我已将所有依赖项存储在供应商文件夹中 使用 Godep 作为助手 它看起来是正确的 但在本地运行应用程序时出现以下错误 go a
  • 从恐慌中恢复的程序未按预期退出

    根据我的理解 当恐慌恢复时 我期望程序退出并表现出正常行为 但事实并非如此 我期望最后一行打印 程序结束 是正确的吗 如果出现运行时错误 它不会被打印 是吗 package main import fmt func main defer f
  • 如何用 Go 将多个字符串解析为模板?

    有没有像这样的简单方法template ParseFiles base html home html 但是对于字符串来说 如何从一组字符串构建模板 我有一个基本模板和一个页面模板列表 全部为字符串 我想在基本模板之上构建它们 我想出了如何合
  • 为什么空切片有 24 个字节?

    我想了解创建空切片时会发生什么make int 0 我执行此代码进行测试 emptySlice make int 0 fmt Println len emptySlice fmt Println cap emptySlice fmt Pri
  • 识别推文消息中正确的主题标签索引

    我需要识别 Twitter 消息 各种语言 表情符号等 中的正确索引 我找不到返回这些位置的解决方案 如下例所示 import regexp testing github com stretchr testify require func
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • 使用私有 git 存储库时的 go 工作区结构

    当你不使用 github 时 我一直在尝试找出 go 代码 工作区的标准文件夹布局 结构 我可以看到如何go get在获取 github 项目时有效 但假设我自己的 git 项目不会有 github com username project
  • 在 Go 中将 float 转换为 int 时如何舍入到最近的 int

    将 float 转换为 int 时 小数点将被丢弃 有什么干净的方法可以将其四舍五入到最接近的整数 x int 3 6 应等于 4 而不是 3 int f 0 5 如果 gt 5 将导致向上舍入
  • 通过 API Gateway 使用表单数据将图像发布到 Lambda 函数会导致文件无效

    I ve a 用 Go 编写的 Lambda 函数 https github com mhausenblas imgn blob master functions app uploadimg main go应该允许图像文件上传 通过 HTM
  • Golang delve,如何启动调试器并启动正在调试的应用程序?

    我正在尝试设置一个可以远程连接的无头深度调试器 我无法找到一种方法来启动调试服务器 而该服务器不会暂停我正在调试的应用程序 我一直在使用dlv attach headless true listen 2345 attach 32但这会暂停该
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso

随机推荐

  • 如何在SceneKit中从Collada文件中分离出多个动画

    我正在将第三方 dae Collada 文件作为场景加载到 SceneKit 项目中 dae 文件中有许多不同的动画 设置在不同的时间 帧 我试图弄清楚如何将它们分开并通过引用名称引用每个单独的动画 dae 文件中没有易于理解的参考名称 动
  • 如何从 Jupyter 4.x 获取 IPython 配置文件行为?

    官方 建议运行 IPython Notebook 服务器 并通过以下方式创建配置文件 ipython profile create nbserver 正如推荐的http ipython org ipython doc 1 interacti
  • DropCreateDatabaseAlways 未调用种子

    我在自定义数据库初始值设定项上调用 Seed 方法时遇到问题 我正在使用 EF 5 0 并具有以下代码 public static class MyDatabase public static void Initialize Databas
  • 是否可以使用gdb和qemu同时调试linux用户空间程序和内核空间?

    到目前为止 使用 gdb qemu 我可以单步执行 Linux 内核源代码 是否可以同时调试用户空间程序 例如 将程序从用户空间单步执行到内核空间 这样我就可以通过发出以下命令来观察 qemu 监视器上寄存器的变化info register
  • 在 foreach 循环内手动增加枚举器

    我在 foreach 循环内有一个嵌套的 while 循环 我想在满足特定条件时无限期地推进枚举器 为此 我尝试将枚举器转换为 IEnumerator 如果它位于 foreach 循环中 则必须如此 然后在转换的对象上调用 MoveNext
  • 网络编程:是否维护套接字?

    我目前正在将 API 从 C 转换为具有网络组件的 Java C 版本似乎在使用其类期间保持输入和输出流以及套接字打开 它是否正确 记住应用程序根据用户输入发送命令和接收事件 为每个 消息 打开一个新的套接字流是否更明智 我正在维护一个 S
  • 如何在 JavaScript 中取消移动或添加到参数对象的开头

    我刚刚学会了弹出第一个元素的约定arguments array 我还了解到这实际上是一个Object 现在我需要做相反的事情 我需要使用一个unshift将值添加到开头的操作arguments数组 或Object就像一个数组 这可能吗 我试
  • R 中 stri_detect_regex 错误

    我收到此错误 stri detect regex string pattern opts regex opts pattern 中的错误 正则表达式模式中的括号嵌套不正确 U REGEX MISMATCHED PAREN 当我运行代码时 f
  • 画布中的矩形尺寸错误

    我正在实现一个颜色选择器 渲染有问题 当我打电话时c fillRect 0 0 100 80 该矩形的大小是 103x42 像素 而不是 100x80 这里有什么问题吗 此外 矩形是抗锯齿的 我是否需要将位置偏移 0 5 0 5 以避免 A
  • 线性 SVM 模型的权重(在 R 中)?

    Using kernlab我用如下代码训练了一个模型 my model lt ksvm result f1 f2 f3 data gold kernel vanilladot 由于它是一个线性模型 我更喜欢在运行时将分数计算为特征值的简单加
  • CXF/ JAX-RS :从拦截器返回自定义响应

    当REST调用过程中发生异常时 我们需要返回自定义的错误代码和错误消息 我们创建了一个异常映射器提供程序 它适用于应用程序代码中的异常 但是 当 CXF 代码发生异常时 例如 我编写的 CustomValidationInterceptor
  • 如何在可变参数模板中匹配空参数包

    我有代码 template
  • 在 Xamarin.Forms 中使用 Thread.Sleep

    我想执行以下操作 MainPage new ContentPage Content new StackLayout Children new Button Text Thread Sleep Command new Command gt T
  • 确定 nvcc 需要哪些 gencode(compute_、arch_)值 - 在 CMake 中

    我使用 CMake 作为我的代码的构建系统 其中涉及 CUDA 我正在考虑将决定哪个任务自动化compute XX and arch XX我需要传递给我的 nvcc 以便为我当前计算机上的 GPU 进行编译 有没有办法做到这一点 使用 NV
  • 如何在 jqgrid 中添加新的按钮/图像列

    我在 ASP net MVC Web 应用程序中使用 JQgrid 我可以使用以下命令添加名为编辑的新按钮列formatters 但是 问题是我无法获取单击按钮的行中的列的值 例如 如果我单击第四行上的按钮编辑 新添加 我将需要获取该特定行
  • 在 Azure 存储上托管 SQLite DB?

    我需要在 Azure 上托管一个 SQLite 数据库 该数据库将在多个 Web 应用程序之间共享 我唯一的选择似乎是 Azure Blob 或文件存储 因为它们摆脱了提供在 Web 实例之间共享的专用存储的 Azure 网站 但是 似乎没
  • 如何条件正则表达式

    我想要一个正则表达式 如果它有 3 个实例 它就做一件事 在字符串中 如果它有超过 3 个实例 则为其他内容 例如 aaa bbb ccc ddd one part of the regex aaa bbb ccc ddd eee the
  • 创建 R 包时包含 jar 文件

    我创建了一个 R 框架包 lib jarFileHere jar R r code file R The r code file R尝试引用一个类文件jar文件在这里 jar library rJava library rjson onLo
  • 如何从 Blob 转到 ArrayBuffer

    我正在研究 Blob 我注意到当你有 ArrayBuffer 时 你可以轻松地将其转换为 Blob 如下所示 var dataView new DataView arrayBuffer var blob new Blob dataView
  • 如何在Go中调用linux共享库函数?

    我有一个 so 文件 我想在 Go 代码中调用其函数 我该如何去做呢 我已经阅读了 cgo 和 syscall 包 它们接近我想要的 但我没有看到任何可以调用 so 文件中的函数的地方 我想完全实现 ctypes 包在 Python 中的功