【解决了一个小问题】macbook m2 下交叉编译 musl-gcc 支持的 gozstd 库
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
我的 golang 项目中使用了 gozstd, 在 macbook m2 下编译当然没有问题。
可是当交叉编译 linux amd64 的二进制时,遇到了问题。
使用 gnu-gcc 是 ok 的
env CC=x86_64-linux-gnu-gcc CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" \
go build -o cmd/server_linux_amd cmd/main.go
使用 musl-gcc 报错
env CC=x86_64-linux-musl-gcc CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" \
go build -o cmd/server_linux_amd cmd/main.go
出现类似这样的错误:
/opt/homebrew/Cellar/go/1.20.4/libexec/pkg/tool/darwin_arm64/link: running x86_64-linux-musl-gcc failed: exit status 1
/opt/homebrew/Cellar/musl-cross/0.9.9_1/libexec/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/ld: /Users/fuchunzhang/go/pkg/mod/github.com/valyala/gozstd@v1.20.1/libzstd_linux_amd64.a(zdict.o): in function `ZDICT_analyzeEntropy':
zdict.c:(.text+0x7d4): undefined reference to `__fprintf_chk'
/opt/homebrew/Cellar/musl-cross/0.9.9_1/libexec/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/ld: zdict.c:(.text+0xd21): undefined reference to `__fprintf_chk'
/opt/homebrew/Cellar/musl-cross/0.9.9_1/libexec/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/ld: /Users/fuchunzhang/go/pkg/mod/github.com/valyala/gozstd@v1.20.1/libzstd_linux_amd64.a(zdict.o): in function `ZDICT_analyzePos':
zdict.c:(.text+0x1922): undefined reference to `__fprintf_chk'
/opt/homebrew/Cellar/musl-cross/0.9.9_1/libexec/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/ld: zdict.c:(.text+0x19b2): undefined reference to `__fprintf_chk'
/opt/homebrew/Cellar/musl-cross/0.9.9_1/libexec/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/ld: /Users/fuchunzhang/go/pkg/mod/github.com/valyala/gozstd@v1.20.1/libzstd_linux_amd64.a(zdict.o): in function `ZDICT_finalizeDictionary':
zdict.c:(.text+0x1cf3): undefined reference to `__fprintf_chk'
/opt/homebrew/Cellar/musl-cross/0.9.9_1/libexec/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/ld: /Users/fuchunzhang/go/pkg/mod/github.com/valyala/gozstd@v1.20.1/libzstd_linux_amd64.a(zdict.o):zdict.c:(.text+0x20b5): more undefined references to `__fprintf_chk' follow
collect2: error: ld returned 1 exit status
解决办法
最后搜索到作者的 github,帖子里介绍了解决办法:https://github.com/valyala/gozstd/issues/20
最终用这样的命令行解决了:
env CC=x86_64-linux-musl-gcc CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" \
go build -tags 'musl' -o cmd/server_linux_amd cmd/main.go
【解决了一个小问题】macbook m2 下交叉编译 musl-gcc 支持的 gozstd 库的更多相关文章
- 【先定一个小目标】Windows下Redis的安装使用
Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- 【先定一个小目标】windows下安装RabbitMQ消息服务器
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. 1:安装RabbitMQ 需要先安装Erlang语言开发包.下载地址 ...
- 【先定一个小目标】Windows下安装MongoDB 3.2
1.MongoDB 安装 官网提供了三个版本下载: - MongoDB for Windows 64-bit 适合 64 位的 Windows Server 2008 R2, Windows 7 , ...
- 【解决了一个小问题】go.mod文件中引用另一个库,总会自动拉取新版本
我的项目依赖某个旧的公共库: require ( git.xxx.com/myprj/mylib v0.0.43 ) 可以编译的时候,系统总会自动加上这样的路径: require ( git.xxx. ...
- 【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty
参考了这篇帖子:golang protobuf从生成的json标记中删除omitempty标记 由于是在windows上开发,因此写了一个python脚本来解决: remove_tag.py impo ...
- 【解决了一个小问题】golang gin框架中的模板,让模板中的参数不要做HTML转义
代码中使用了类似的方式来向模板填充参数: c.HTML(200, "list.html", gin.H{"data":builder.String()}) 模板 ...
- 【解决了一个小问题】如何展示VictoriaMetrics组件上报的bucket数据
VM体系还真的是不一(he)样(qun), 它上报的监控数据长这样: vmagent_remotewrite_block_size_rows_bucket{vmrange="2.448e+0 ...
- 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误
编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...
- 【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"
在项目中的go.mod文件中有这样一句: require ( github.com/xxx-devops/xx1/sdk/go v2.2.3 ) 项目的编译没有问题,但是goland中出现如下提示: ...
- 【解决了一个小问题】alpine镜像中,busybox的date命令获取昨天的日期
直接上答案: date -d@"$(( `date +%s`-86400))" +"%Y-%m-%d"
随机推荐
- 从java到JavaScript(2):对比Java/Go/Swift/Rust看Dart
Dart与Java的一些直观区别 Dart和java以及C#都差不多,基本上不用学习可以直接使用,从这里可以你可以了解Dart有些特别之处.其实对于Java开发人员来说Dart,还是相对好理解的 基本 ...
- 火山引擎智能外呼联合火山引擎VeDI升级服务,让企业精准营销不再难
企业营销模式正在经历一场巨变.数字化营销早已替代传统的营销方式,成为企业营销的主流方式和发展战略中不可或缺的部分.然而随着数字化营销的普及,市场迈入存量竞争时代,获客成本也逐年攀升.面对营销过程中不断 ...
- Solon 的常用配置
一.服务端基本属性 #服务端口(默认为8080) server.port: 8080 #服务的 http 信号端口(默认为 ${server.port}) server.http.port: 8080 ...
- PPT 常规设置
高级设置 可以将撤销次数调大,最多 150次 默认拉到PPT中的图片是被压缩的,可以设置成不压缩(解压 PPT 可查看里面的图片大小) 字体嵌入 可将自动保存时间调短,默认保存目录我习惯先保存到桌面( ...
- Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
test下的包名和java下的包名不一致会产生下面错误 java.lang.IllegalStateException: Unable to find a @SpringBootConfigurati ...
- 利用PE工具箱安装WINDOWS系统
一. 进入PE系统 U盘插入电脑,开机多次按F12(联想F12,华硕ESC,DELL F9,微星F11,大部分都是这样,实在不行就按F2进BIOS改)键进入类似如下图界面,选择U盘启动,(能选UE ...
- vue3引入使用svg图标
vue3使用svg图标 安装 // 通过命令安装2个插件 npm i vite-plugin-svg-icons -D npm i fast-glob -D 在vue.config.js中配置 //v ...
- 使用屏幕捕捉API:一站式解决屏幕录制需求
随着科技的发展,屏幕捕捉API技术逐渐成为一种热门的录屏方法.本文将详细介绍屏幕捕捉API技术的原理.应用场景以及如何利用这一技术为用户提供便捷.高效的录屏体验. 在线录屏 | 一个覆盖广泛主题工具的 ...
- 2019 篇 - 分享数百个 HT的工业互联网 2D 3D 可视化应用案例
继<分享数百个 HT 工业互联网 2D 3D 可视化应用案例>2018 篇,图扑软件定义 2018 为国内工业互联网可视化的元年后,2019 年里我们与各行业客户进行了更深度合作,拓展了H ...
- linux有用的命令
如下是一些在工作中偶尔会用到,每次用的时候都要查一查资料的命令这里总结一下方便今后查阅 0.查看操作系统版本 cat /etc/issue 或 cat /etc/redhat-release 1.后 ...
