作者:张富春(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. SEAL 0.3 正式发布:国内首个全链路软件供应链安全管理平台

    12月1日,软件供应链安全管理平台 SEAL 0.3 正式发布(以下简称"SEAL"),这是国内首个以全链路视角保护软件供应链的安全管理平台.两个月前 SEAL 0.2 发布,该版 ...

  2. 7z压缩测试

    注意: CompressionLevel 选择

  3. django读取数据库导出excel

    路由 path(r'^export/xls/$', views.export_excel, name='export_excel'), 函数 import xlwt from django.http ...

  4. 【主流技术】聊一聊 Redis 的基本结构和简单应用(一)

    目录 前言 一.String 类型 二.List 类型 三.Hash 类型 四.Set 结构 五.Sort Set (Zset)结构 六.文章小结 前言 Redis 是目前互联网后端的热门中间件之一, ...

  5. 聚合查询 分组查询 F与Q查询 添加新字段

    目录 聚合查询 aggregate 聚合函数 起别名 分组查询 annotate 注释函数 起别名 分组查询报错 分组查询练习 总结 添加新字段 F与Q查询 F查询 字符串拼接 concat方法 Q查 ...

  6. 遇到 Request header is too large,你是如何解决的?

    看到群里有小伙伴问,这个异常要怎么解决: java.lang.IllegalArgumentException: Request header is too large 异常原因 根据Exceptio ...

  7. C++ 的两种换行符区别

    当我们在C++执行一个输出语句时,在输出语句最后可以使用 std::endl 或 \n 建立一个新行. 但这两种换行方式对程序有不同的影响. std::endl 它在建立一个新的行的同时,还会自动刷新 ...

  8. OpenSCA受邀出席2023 Open Compliance Summit

    近日,由Linux基金会主办的2023 Open Compliance Summit(开放合规峰会,简称OCS)在日本东京隆重召开.悬镜安全旗下全球极客开源数字供应链安全社区OpenSCA受邀参与,O ...

  9. 你想怎么使用 Serverless 函数计算?(评测赢好礼 )

    随着云计算发展,云原生热度攀升,Serverless 架构崭露头角且发展势头迅猛.不仅被更多开发者所关注,市场占有率也逐年提高.阿里云函数计算(Function Compute)是一个事件驱动的全托管 ...

  10. js md5 和java md5后的值不一样

    开发发现js 对字符串md5 和 java对字符串md5 计算的结果居然不一样,后来找了一个匹配的这里记录一下 注:加密的对象中不能有空格,有空格md5后的结果就不一致,都是眼泪.. js md5算法 ...