一尘不染

交叉编译共享库

go

我想知道是否有可能(如果可以:如何)使用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)。我有什么选择?

设置GOOSdarwin运行上面的linux上,我得到

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

有任何想法吗?


阅读 250

收藏
2020-07-02

共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进行交叉编译的维护。

2020-07-02