交叉编译共享库
Cross compile shared libraries
我想知道是否可以(如果可以:如何)使用 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
有什么想法吗?
构建客户端时使用:
package main
...但是构建库使用:
package mylibname
您面临的问题实际上不是关于编译共享库或可执行文件,而是关于使用 cgo 并尝试交叉编译。 (不过,如果你想要一个库,而不是一个可执行文件,包名不应该是 main
。)
交叉编译时,默认关闭cgo。如果您添加环境变量 CGO_ENABLED=1
,那么您的示例将起作用:
CGO_ENABLED=1 GOOS=darwin go build -o libdoubler.dylib -buildmode=c-shared doubler
请记住,在交叉编译时使用 cgo 会很麻烦。您需要确保目标平台的 C 库已在您的主机上准备就绪。如果不是真的需要,请远离cgo。如果必须,那么你可以考虑在目标机器上编译,而不是处理与cgo交叉编译的维护。
我想知道是否可以(如果可以:如何)使用 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
有什么想法吗?
构建客户端时使用:
package main
...但是构建库使用:
package mylibname
您面临的问题实际上不是关于编译共享库或可执行文件,而是关于使用 cgo 并尝试交叉编译。 (不过,如果你想要一个库,而不是一个可执行文件,包名不应该是 main
。)
交叉编译时,默认关闭cgo。如果您添加环境变量 CGO_ENABLED=1
,那么您的示例将起作用:
CGO_ENABLED=1 GOOS=darwin go build -o libdoubler.dylib -buildmode=c-shared doubler
请记住,在交叉编译时使用 cgo 会很麻烦。您需要确保目标平台的 C 库已在您的主机上准备就绪。如果不是真的需要,请远离cgo。如果必须,那么你可以考虑在目标机器上编译,而不是处理与cgo交叉编译的维护。