【问题标题】:Cross compile shared libraries交叉编译共享库
【发布时间】:2017-04-30 20:25:42
【问题描述】:

我想知道是否可以使用 Go 交叉编译共享库(如果可以:如何)。假设我有这个代码:

package main

import "C"

//export DoubleIt
func DoubleIt(x int) int {
    return x * 2
}

func main() {}

src/doubler/main.go。在 Mac 上我可以运行

go build -o libdoubler.dylib -buildmode=c-shared doubler

获取名为libdoubler.dylib 的共享库。在 linux 上类似,只是扩展名为 .so

现在我想使用 Linux 作为主要平台来构建我的库(适用于 Mac 和 Windows)。我有哪些选择?

GOOS 设置为 darwin 并在 linux 上运行上述代码,我得到了

can't load package: package doubler: no buildable Go source files in /home/patrick/Desktop/go/src/doubler

有什么想法吗?

【问题讨论】:

    标签: go shared-libraries cross-compiling


    【解决方案1】:

    您面临的问题实际上不是关于编译共享库或可执行文件,而是关于使用 cgo 并尝试交叉编译。 (不过,如果你想要一个库而不是可执行文件,包名不应该是 main。)

    交叉编译时,默认禁用 cgo。如果您添加环境变量CGO_ENABLED=1,那么您的示例将起作用:

    CGO_ENABLED=1 GOOS=darwin go build -o libdoubler.dylib -buildmode=c-shared doubler
    

    请记住,在交叉编译时使用 cgo 会很麻烦。您需要确保目标平台的 C 库已在您的主机上准备就绪。如果不是真的需要,远离cgo。如果必须的话,可以考虑在目标机器上编译,而不是用cgo去处理交叉编译的维护。

    【讨论】:

    • 说,不要在我的机器上工作。 ld 无法识别标志并且 gcc 返回退出状态 1
    • package main-buildmode=c-shared 不能一起工作。我假设 OP 知道它,因为另一个答案已经说明了这个问题。我已经编辑了我的答案以澄清这一点。非常感谢!
    • 我一直拼错 CGO_ENABLED... 现在它“工作”在某种意义上它不再抛出任何错误。我希望没有安装交叉编译环境的解决方案。
    • @hasanyasin 我对 OS X 上的package main 没有任何问题。
    • 如果包是主包,我们在 linux 机器上使用 GOOS=darwin 进行交叉编译,我们希望它生成一个共享包,然后链接失败,如 uvelichitel 所述。如果你使用纯 go,那么交叉编译是轻而易举的事。如果你使用非 Go 库,那么就没有办法让这些库用于目标平台。没有乐高积木就不能玩乐高。 :)
    【解决方案2】:

    在构建客户端时使用:

    package main 
    

    ...但是构建一个库使用:

    package mylibname
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-18
      • 2017-06-07
      • 2017-10-23
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多