【问题标题】:Shared library in Go?Go 中的共享库?
【发布时间】:2010-12-17 22:39:27
【问题描述】:

是否可以使用 Go 创建共享库 (.so)?

更新:为它创建了一个“issue”。

【问题讨论】:

  • 如果您想支持动态加载(如果您在库中进行了更改,因此对 .so 文件进行了更改,但您希望使用此库的主代码自动使用较新的版本,而无需重新编译主代码),Go Plugins 可能更可取。 golang.org/pkg/plugin

标签: shared-libraries go


【解决方案1】:

显然,现在是可能的,但只有在非常精确的情况下。更准确地说,如果您正在为 Android 平台编写代码。

GitHub 上的“goandroid”项目提供了一组补丁,允许 Go 构建一个共享库,以用于 Android NDK 的特定用途。见https://github.com/eliasnaur/goandroid

【讨论】:

  • 截至目前(2013 年 7 月),它是 Go 工具的扩展,并未内置于 Google 提供的 Go 工具中。
  • @Nate 你能链接到扩展吗? (独立)扩展程序只能在 android 上使用还是也可以在桌面上使用?
  • @mihaistancu 我想交叉编译 go for android 不会太难,见here。考虑到 golang 1.5 支持 iOS,很快就会得到官方支持。
  • @Nate -- 我的问题是:“该扩展是否在 android 上工作,或者我(目前)可以将桌面 go 包编译为共享对象吗?”。
  • @Nate 所以我根本没有兴趣为 android 编译。我只想为桌面编译共享对象。我自己研究过这个主题,显然有一些带有go build -shared 标志的编译器支持。
【解决方案2】:

Go Execution Modes 描述将 Go 包构建为共享库

“在这种模式下,可以将一个 Go 包或一组包构建为共享库。导入一个或多个这些 Go 包的 Go 程序可能会链接到该共享库。共享库可能会更改在 Go 程序链接到它运行的时间之间;程序启动时可用的共享库将被使用...

在 Go 1.5 版本中,这仅针对 linux-amd64 目标实现。使用 gccgo 时,它适用于任何受支持的目标。”

【讨论】:

  • 我回到这个问题也写了一个更新。 +1
【解决方案3】:

现在可以使用-linkshared 标志

你需要做的是首先运行这个命令:

go install -buildmode=shared -linkshared  std

(上面的代码使所有常见的包都可以共享!) 那么

go install  -buildmode=shared -linkshared userownpackage

最后在编译你需要运行的代码时:

go build -linkshared yourprogram

以上内容现在不是静态链接所有内容,而是动态链接它们,您最终会得到更小的编译文件。只是为了给你一个想法,我的“hello.go”文件使用静态链接是 2.3MB,而使用动态链接的相同代码只有 12KB!

【讨论】:

  • 这就是我要找的。但是在我的 Mac 上给出了-buildmode=shared not supported on darwin/amd64
  • 我能够完美地创建一个.so,但是如何将我的程序的方法放入那个.so?另外我的程序名称是sample.go,它的包也是同名的,它创建了一个名为libcommand-line-arguments.so的.so
【解决方案4】:

现在可以了!我使用 Go 构建了一个 .so 文件,然后很容易导入到 python 中!这是我喜欢的一篇文章:http://www.darkcoding.net/software/building-shared-libraries-in-go-part-1/

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2016-09-20
    • 2013-05-24
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多