【问题标题】:unable to cross compile from OSX to Linux无法从 OSX 交叉编译到 Linux
【发布时间】:2018-12-07 23:47:27
【问题描述】:

当我尝试将我的 golang 项目从 OSX 交叉编译到 Linux 时,我收到以下错误消息:

# runtime/cgo ld: unknown option: --build-id=none clang: error: linker command failed

编译中止。

这就是我尝试构建应用程序的方式:

CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build

我也尝试过使用 gox:

 gox -os="linux"

但还是不行。

如果我不使用GOOS=linux 标签,一切都会按预期工作,并且我能够成功地为/在我的 OSX 机器上构建/运行我的项目。

【问题讨论】:

  • 如果没有minimal reproducible example,我们只能猜测。声明 Image 的文件的构建约束是什么?
  • Image 位于使用 cgo 的文件中,而您没有使用 cgo 进行编译。您是否还安装了完整的工具链以将 C 代码交叉编译到 Linux?
  • 如果您现在使用的是CGO_ENABLED=1,并且源代码中没有构建约束,但仍然没有,那么文件的名称是什么?
  • cgo 之前没有启用,因为您需要显式启用它以进行交叉编译。该消息是因为您没有使用正确的工具链来定位 linux。如果您有合适的工具,您可以使用CC_FOR_TARGETCXX_FOR_TARGET 来指定它们(在docs here 中查找“交叉编译”)。在 docker 容器中构建它可能比尝试运行交叉编译要容易得多。
  • 这不是一个真正的初学者主题,但您需要从安装 linux 的交叉编译器开始,可能是 gcc(可能还有任何缺少的标头)。在 docker 容器中构建会“正常工作”,所以这是我的建议。关于如何使用 docker 有大量的资源。

标签: go compiler-errors compilation


【解决方案1】:

我可以确认命令

$env CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -v main.go

在 MacOS X High Sierra 上与“Hello World”main.go 文件完美配合,无需安装任何其他东西,只需 go(另请参阅 here)。

正如 cmets 中已经指出的那样,您可能正在尝试使用 cgo 进行编译,并且显然缺少部分工具链和/或标头,这就是您的链接器抛出错误的原因。请提供可接受的example,否则我们将无法为您提供帮助。

【讨论】:

  • 非常感谢您的回答。我怎样才能检测到工具链的缺失部分?
  • 首先,我建议检查您是否可以使用上述所述的命令编译“Hello World”程序。那样有用吗?另外,$go env$gcc -v 的输出是什么?我绝不是cgo 专家,所以您可能想仔细看看各自的docs。另外,请尝试发布一个最小示例,以便我们可以尝试重现您的错误。
  • 你好丹尼尔,非常感谢你帮助我。我什至无法编译一个简单的 hello world 应用程序。我现在收到以下错误。 # runtime/cgo ld: unknown option: --build-id=none clang: error: linker command failed with exit code 1 (使用 -v 查看调用)
  • 请将$go env$gcc -v 的输出添加到您的问题中。
【解决方案2】:

您需要安装适当的工具链才能做到这一点。

为了构建与您的构建不同的架构的二进制文件 主机,你需要的不仅仅是一个交叉编译器——你需要一个 成熟的工具链,创建起来真的很痛苦,因为你 可能被发现了。

几种方法:

在虚拟机中使用适当的 Linux 发行版,例如 虚拟盒子。如果您只想为 Linux/i386 构建二进制文件 MacOSX/x86_64 主机,在我看来,这是最简单、最安全且 最干净的解决方案。当然,它不是一个交叉编译器,但它 工作,它有一个额外的优势,你可以实际测试你的 可执行文件。

使用 crosstool-NG 之类的脚本(原始的后代 crosstool) 自动构建工具链 - 绝对更容易 而不是自己构建它,尽管你可能不得不妥协 编译器版本稍旧。

Cross compiler for linux on mac os x

【讨论】:

  • 这不应该是公认的答案。引用“自从 Go 版本 1.5 交叉编译变得非常容易”official source。在这种特殊情况下,一些必需的go tools 未安装see here
猜你喜欢
  • 2012-07-11
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2017-02-03
  • 2014-01-16
  • 2020-01-28
相关资源
最近更新 更多