Linux arm/7交叉编译clang报'-marm'参数未使用的原因及解决方法
报错原因
- 开启
CGO_ENABLED=1进行arm架构Linux程序交叉编译时,Go工具链默认会给cgo传递-marm参数适配arm32架构。但你当前macOS系统默认的clang是面向本机darwin/amd64平台的,既不识别也不需要用到这个面向Linux arm平台的编译参数,同时Go默认将cgo的警告视为错误,最终触发了本次编译失败。
解决方法
- 方案1:无CGO依赖时直接关闭CGO
如果你的代码完全没有用到CGO相关逻辑,直接把CGO_ENABLED设为0跳过cgo编译环节即可,修改后的编译命令如下:
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build
- 方案2:有CGO依赖时安装对应交叉编译工具链
如果确实需要使用CGO,你需要安装目标平台的交叉编译工具链,不能使用系统默认的clang。macOS下可以通过homebrew安装arm-linux-gnueabihf系列工具:
- 执行安装命令:
brew install arm-linux-gnueabihf-binutils arm-linux-gnueabihf-gcc - 编译时指定交叉编译器,修改后的编译命令如下:
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnueabihf-gcc go build
- 方案3:临时忽略警告(不推荐生产环境使用)
如果只是临时测试不想安装交叉编译工具,可以添加cgo参数忽略该警告,修改后的编译命令如下:
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CGO_CFLAGS="-Wno-unused-command-line-argument" go build
内容的提问来源于stack exchange,提问作者Zeta Chow 晓代码
相关产品推荐
相关产品推荐

