【发布时间】:2019-10-31 00:05:18
【问题描述】:
我有一个 makefile 说明
CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOARCH=arm64 GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/victoria-metrics-arm64 ./app/victoria-metrics
我已经安装了 aarch64-linux-gnu-gcc 之类的二进制文件
mkdir aarch64-toolchain
cd aarch64-toolchain/
wget http://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/aarch64-linux-gnu/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz
tar -Jxvf gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz
并将其导出到 Path 变量
uname -a 命令的输出给出
Linux prom 4.14.0-115.2.2.el7a.aarch64 #1 SMP Wed Nov 28 22:05:51 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux
现在我收到错误
CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOARCH=arm64 GO111MODULE=on go build -mod=vendor -ldflags "-X 'github.com/VictoriaMetrics/VictoriaMetrics/lib/buildinfo.Version=-20190716-133242-heads-master-0-gfb14f23'" -o bin/victoria-metrics-arm64 ./app/victoria-metrics
# runtime/cgo
fork/exec /usr/bin/aarch64-linux-gnu-gcc: exec format error
make: *** [victoria-metrics-arm64] Error 2
请帮助我解决问题。我被困了很久
【问题讨论】:
-
您在 aarch64 上,但您安装了 x86_64 编译器,允许您交叉编译 aarch64。只需安装 gcc。
-
感谢@KamilCuk 的回复。如果我使用 CC=gcc 那么它适用于我,但如果我必须使用 CC=aarch64-linux-gnu-gcc 用于 aarch64,是否有任何步骤可以让它运行。感谢您的快速响应
-
这还不清楚。为什么“你必须”?你在 aarch 64架构。
aarch64-linux-gnu-gcc是一个交叉编译器。想想看。让我们从顶部开始。有一个x86_64-linux-gcc编译器。它是用 C 语言编写的。它为 x86_64 架构编译代码。它是使用自己编译的,但是是旧版本,然后是自己编译的。好的。所以有aarch64-linux-gnu-gcc编译器。它是用 C 编写的。它为aarch64架构生成代码。然后用gcc编译aarch-linux-gnu-gcc。它是为 x86_64 架构编译的编译器,可为 arch64 生成代码。 -
术语“交叉编译”是为您所在的另一个架构进行编译。如果要交叉编译,则在 x86_64 架构上编译为 aarch64 架构。如果你为 aarch64 编译 aarch64 代码,这就像一个正常的编译,它只是
gcc在那个架构上。你会得到“exec:格式错误”,因为程序是为 x86_64 架构编译的。然后你尝试在 aarch64 上运行它。它们是不相容的。在机器指令级别上,两种架构的汇编代码是不兼容的。所以你得到一个错误。你还想要什么?你有什么问题? -
我明白你的意思@KamilCuk。我知道如果我有 aarch64,那么我应该使用 CC=gcc 作为交叉编译器,对于 x86_64,我需要使用 CC=aarch64-linux-gnu-gcc。感谢您的帮助。
标签: gcc cross-compiling