作者:张富春(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 库的更多相关文章

  1. 【先定一个小目标】Windows下Redis的安装使用

    Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  2. 【先定一个小目标】windows下安装RabbitMQ消息服务器

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. 1:安装RabbitMQ 需要先安装Erlang语言开发包.下载地址  ...

  3. 【先定一个小目标】Windows下安装MongoDB 3.2

    1.MongoDB 安装 官网提供了三个版本下载: - MongoDB for Windows 64-bit 适合 64 位的 Windows Server 2008 R2, Windows 7 , ...

  4. 【解决了一个小问题】go.mod文件中引用另一个库,总会自动拉取新版本

    我的项目依赖某个旧的公共库: require ( git.xxx.com/myprj/mylib v0.0.43 ) 可以编译的时候,系统总会自动加上这样的路径: require ( git.xxx. ...

  5. 【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty

    参考了这篇帖子:golang protobuf从生成的json标记中删除omitempty标记 由于是在windows上开发,因此写了一个python脚本来解决: remove_tag.py impo ...

  6. 【解决了一个小问题】golang gin框架中的模板,让模板中的参数不要做HTML转义

    代码中使用了类似的方式来向模板填充参数: c.HTML(200, "list.html", gin.H{"data":builder.String()}) 模板 ...

  7. 【解决了一个小问题】如何展示VictoriaMetrics组件上报的bucket数据

    VM体系还真的是不一(he)样(qun), 它上报的监控数据长这样: vmagent_remotewrite_block_size_rows_bucket{vmrange="2.448e+0 ...

  8. 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误

    编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...

  9. 【解决了一个小问题】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中出现如下提示: ...

  10. 【解决了一个小问题】alpine镜像中,busybox的date命令获取昨天的日期

    直接上答案: date -d@"$(( `date +%s`-86400))" +"%Y-%m-%d"

随机推荐

  1. 带你掌握不同平台下,探索JDK源码所需的native方法

    摘要:要探索JDK的核心底层源码,那必须掌握native用法.文章中会以"获取系统的默认时区"为例,介绍说明如何查看native对应方法的源码. 本文分享自华为云社区<要探索 ...

  2. 克魔助手:方便查看iPhone应用实时日志和奔溃日志工具

    ​ 克魔助手:方便查看iPhone应用实时日志和奔溃日志工具 查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具,该工具可以方便地查看iPhone设备上应用和系统运行 ...

  3. iOS IPA包的制作和上传步骤详解​

    目录 前言 一.IPA包的原理 二.IPA包上传的步骤 1.注册开发者账号 2.创建应用程序 3.编码和设计 4.生成证书和配置文件 5.打包IPA包 6.上传IPA包 三.总结 前言 iOS IPA ...

  4. 火山引擎DataLeap如何解决SLA治理难题(三): 平台架构与未来展望

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 平台架构总结 火山引擎 DataLeap SLA平台整体主要分为基础组件.规划式治理服务.响应式治理服务三大块,系 ...

  5. python版本升级到3.8以及安装虚拟环境

    linux系统升级python版本看起来复杂,如果知道其中步骤也不会觉得很困难.下面记录在deepin系统 15.11和ubuntu16.04系统下将python从2.7升级到3.8过程 升级pyth ...

  6. .NET使用QuestPDF高效地生成PDF文档

    前言 在.NET平台中操作生成PDF的类库有很多如常见的有iTextSharp.PDFsharp.Aspose.PDF等,今天我们分享一个用于生成PDF文档的现代开源.NET库:QuestPDF,本文 ...

  7. AtCoder ABC 164 (D~E)

    比赛链接:Here ABC水题, D - Multiple of 2019 (DP + 分析) 题意: 给定数字串S,计算有多少个子串 \(S[L,R]\)​ ,满足 \(S[L,R]\) 是 \(2 ...

  8. C++实现简单的日期正则表达式

    简单的日期正则表达式 一个简单的日期解析程序,从yyyy-mm-dd格式的日期字符串中,分别获取年月日. 先设置一个简单的正则表达式,4位数字的"年",1-2位数字的"月 ...

  9. windows不安装虚拟机如何使用Linux系统作为开发工具?

    哈喽,大家好,我是仲一.作为嵌入式开发程序员,常常需要在Linux环境下编译一些代码.安装虚拟机比较方便,但是,太占用内存了.性能不好的电脑开了一台虚拟机后,可能就干不了其他事情了.安装双系统也比较麻 ...

  10. SpringBoot 动态多线程并发定时任务

    一.简介 实现定时任务有多种方式: Timer:jdk 中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务. ScheduledExecutorS ...