【问题标题】:Cross-compilation of cgo (for darwin) failscgo (for darwin) 的交叉编译失败
【发布时间】: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。

标签: linux go darwin cgo


【解决方案1】:

感谢 JimB 的 cmets,我现在能够在 linux 上为 darwin 成功编译我的代码。

我需要的是一个 osx 工具链,例如 github.com/tpoechtrager/osxcross

然后我通过 env OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1 MACOSX_DEPLOYMENT_TARGET=10.6 CC=o64-clang CXX=o64-clang++ GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build -v mywork/myprogram 编译了我的代码。

我的一些程序编译成功,一些在链接时抛出错误,但我想这是另一个问题,所以我将这个问题标记为在交叉编译过程中已解决。

【讨论】:

    猜你喜欢
    • 2015-04-24
    • 2022-06-17
    • 2023-03-16
    • 2018-04-03
    • 2018-08-08
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多