当前位置: 首页 > 面试题库 >

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

苏嘉志
2023-03-14
问题内容

我有一个.so文件,我想在我的Go代码中调用其功能。

我该怎么做呢?我已经阅读了cgo和syscall软件包。它们接近我想要的位置,但是我看不到可以在.so文件中调用函数的任何地方。

我想确切地实现ctypes包在Python中的功能。

有人可以帮忙吗?


问题答案:

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

package example

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

func main() {
    C.bar()
}

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



 类似资料:
  • 问题内容: 从共享库/ dll调用函数的最简单,最安全的方法是什么?我对在Linux上执行此操作最感兴趣,但是如果有一种与平台无关的方法会更好。 有人可以提供示例代码来显示如何在用户将自己的版本编译到共享库的情况下执行以下工作吗? 顺便说一句,我知道如何编译共享库(),我只需要知道一种在运行时加载它的简单方法。 问题答案: 注意: 您正在库调用周围传递C 对象(在这种情况下为STL字符串)。有 *

  • 问题内容: 有什么方法可以从Java代码中调用库中的函数吗?通常,可以在Java程序中使用Linux 库吗? 问题答案: 答案是“ JNI” :) 这里有几个链接: 如何在Linux上为JNI应用程序编译动态库? http://learn-from-the-guru.blogspot.com/2007/12/java-native-interface-jni-tutorial-hell.html

  • 问题内容: 是否可以使用Go创建共享库(.so)? 更新 :为此创建了一个“ 问题 ”。 问题答案: 现在可以使用标志 您需要做的是首先运行以下命令: (以上代码使所有通用软件包都可共享!)然后 最后,在编译代码时,您需要运行: 上面这些就是什么,而不是静态链接所有内容而仅动态链接它们,您最终将获得更小的编译文件。为了让您了解我的带有静态链接的“ hello.go”文件为2.3MB,而使用动态链接

  • 我正在尝试开发共享库,目录结构如下 src/com/mycomapny 我的测试。棒极了 测试。棒极了 我的Jenkinsfile调用test.groovy中唯一可用的方法,需要输入。它导入MyTest并创建对象,调用构造函数,然后是执行MyTest.groovy文件中可用功能的实际方法 在这里,构造函数类从未从全局vars/test调用过。棒极了 我尝试从groovy调用类和方法,它工作正常,但

  • 问题内容: 我正在Linux下使用C ++开发共享库,并且我希望该库使用log4cxx进行日志记录。但是,我不确定该如何设置。为了使log4cxx正常工作,我需要创建一个记录器对象。我如何确保在加载库时创建了该对象? 我怀疑将记录器对象创建为全局变量,然后从我的库的任何源文件中使用它,在标头中将其声明为extern,将是最容易的。但是,一旦应用程序连接到库,如何自动创建记录器? 我知道在Windo

  • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?