【问题标题】:Cross compile CGO app on darwin for linux在 darwin for linux 上交叉编译 CGO 应用程序
【发布时间】:2015-04-24 06:43:51
【问题描述】:

我在尝试在 OS X 上交叉编译 Go 应用程序以在 linux/amd64 上运行时遇到问题。有问题的应用程序通过此vips go package 使用libvips。因此,它使用的是 CGO,需要在 CGO 支持下编译。

我正在使用 Go 1.4 并运行以下构建命令

GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build

但最终会出现链接器错误

ld: unknown option: --build-id=none clang: error: linker command failed with exit code 1 (use -v to see invocation)

我假设我可能需要添加某种 -ldflags 参数,但不确定。

是否有可能以这种方式交叉编译 CGO 应用程序,还是我需要在目标系统上进行本地构建以避免问题和麻烦?

【问题讨论】:

  • 我没有 OSX,但它看起来像是一个糟糕的 ld 版本或其他东西。我想说的是启动一个 vm(qemu 可以在 mac 上工作吗?)然后在那里进行编译会更容易。
  • 是的,我可以通过虚拟机进行本地编译,当然,整个过程可以自动化。我只是想努力解决问题,看看我是否可以像使用非 CGO golang 程序一样,一次完成所有本地交叉编译
  • 我会尝试看看您是否可以获得更新/不同版本的 clang 和 ld 但也许其他人会知道得更好。
  • --build-id 是 GNU ld 识别的命令行参数(在 Linux 上使用),所以看起来你在这里使用的是 Mac 工具链。您可能需要安装 Linux 交叉编译器工具链才能使其工作,但我自己从未在 MacOS 上做过。
  • @cpjolicoeur 有点晚了,但也许我可以帮助其他人。在 linux 上(本机)使用 clang 时,我总是遇到此链接器错误,解决方案(对我而言)是在这种情况下覆盖 CCCXX 环境变量以使用 gcc。

标签: linux go cross-compiling darwin cgo


【解决方案1】:

快进到 2022 年,使用 docker 将 CGO 应用程序交叉编译到其他平台是您最好和最干净的选择。构建包含正确跨平台编译器和 C 库的 docker 容器。这就是我cross-compile my Cgo applications with Docker 的方式。这是repo with the dockerfiles

【讨论】:

    【解决方案2】:

    看看gonative。这允许您交叉编译 cgo 代码(只要您只是使用 stdlib)。

    另一种方法是使用 docker 编译 linux 二进制文件。

    【讨论】:

      猜你喜欢
      • 2016-03-09
      • 2022-06-17
      • 2021-03-04
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2018-09-04
      • 2021-03-17
      相关资源
      最近更新 更多