我想知道是否有可能(如果可以:如何)使用Go交叉编译共享库。说我有这段代码:
package main import "C" //export DoubleIt func DoubleIt(x int) int { return x * 2 } func main() {}
在中src/doubler/main.go。在Mac上,我可以运行
src/doubler/main.go
go build -o libdoubler.dylib -buildmode=c-shared doubler
获得名为的共享库libdoubler.dylib。与Linux类似,只是扩展名为.so。
libdoubler.dylib
.so
现在,我想使用Linux作为构建库的主要平台(适用于Mac和Windows)。我有什么选择?
设置GOOS来darwin运行上面的linux上,我得到
GOOS
darwin
can't load package: package doubler: no buildable Go source files in /home/patrick/Desktop/go/src/doubler
有任何想法吗?
您面临的问题实际上与编译共享库或可执行文件无关,而与使用cgo并尝试交叉编译有关。(不过,如果您要的是库而不是可执行文件,则包名称不应为main。)
main
交叉编译时,默认情况下cgo是禁用的。如果添加环境变量CGO_ENABLED=1,那么您的示例将起作用:
CGO_ENABLED=1
CGO_ENABLED=1 GOOS=darwin go build -o libdoubler.dylib -buildmode=c-shared doubler
请记住,在交叉编译时使用cgo会很麻烦。您将需要确保目标平台上的C库已在主机上准备好。如果没有必要,请远离cgo。如果需要,则可以考虑在目标计算机上进行编译,而不是使用cgo进行交叉编译的维护。