【发布时间】:2016-03-09 03:57:33
【问题描述】:
我还是个新手,甚至是一般的 Linux。
我在 Linux 环境中构建了一个应用程序,该应用程序使用了基于 cgo (https://github.com/mattn/go-gtk/) 的 gtk 库。该应用程序在其本机环境(linux 64bit)中构建良好,但是当我尝试为 darwin 64bit 编译时,我得到以下结果:
# net
could not determine kind of name for C.AI_MASK
# net
could not determine kind of name for C.AI_MASK
我用来构建的命令行:
env GOOS=$1 GOARCH=$2 CGO_ENABLED=1 go build $3
$1 是 darwin,$2 是 amd64($3 是我的应用程序的路径)。
由于错误似乎来自我导入的库,我不确定如何修复它。我还读到交叉编译 cgo 并不能真正工作,因为它依赖于本地 macos 东西,所以它需要在 mac 上构建。这是真的还是我可以做些什么来让它在我的环境中工作?
我也有点困惑,因为似乎大多数讨论这个主题的人都在谈论 go pre 1.5,如果我理解正确的话,这在交叉编译方面是完全不同的。
谢谢
【问题讨论】:
-
您是否正确设置了 clang 或 gcc 以进行交叉编译?
-
我不确定,“正确设置”是什么意思,如何检查?
-
您需要能够交叉编译C程序才能交叉编译使用cgo的go程序; go 不能为你做到这一点。完成设置后,您可以设置正确的 env 变量来告诉 go 为请求的目标调用哪个编译器:golang.org/cmd/cgo
-
我不明白。我安装了 gcc 和 clang(不确定需要什么“设置”)并且我能够为 linux 386(“本机”)编译我的程序,所以这是否意味着它可以成功编译 C 代码?我不明白为什么当目标是 darwin 时 C 代码的编译不同(并且失败)。
-
仅仅拥有一个 C 编译器并不足以针对另一个操作系统/架构;您还需要为目标编译的所有相关头文件和库。从 Linux 编译到 darwin 并不是一项很常见的任务,但我确实看到有人使用工具构建的 GH 存储库来提供帮助:github.com/tpoechtrager/osxcross。