Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时,遇到的错误及处理过程(踩坑之旅)!

一、gozstd简介

gozstd是一个针对Zstandard(简称Zstd)的Go语言包装器,它提供了简单且高效的API,使得开发者能够在Go程序中便捷地进行数据压缩和解压操作。

gozstd可用于数据存储和传输、日志处理、实时流处理、云服务等场景。

gozstd 包的具体详情见:https://pkg.go.dev/github.com/valyala/gozstd#section-readme

二、使用方法及报错处理

1、使用方法

在window10系统中,使用 gozstd 包进行数据压缩,方法如下:

  • 下载 gozstd 包
go get -u github.com/valyala/gozstd
  •  引入 gozstd 包
import "github.com/valyala/gozstd"
  •  调用压缩及解压数据的方法
package main

import (
	"fmt"
	"log"

	"github.com/valyala/gozstd"
)

func main() {
	data := []byte("hello world")
	// 压缩数据
	compressedData := gozstd.Compress(nil, data)
	// 解压数据
	decompressedData, err := gozstd.Decompress(nil, compressedData)
	if err != nil {
		log.Fatalf("cannot decompress data: %s", err)
	}

	fmt.Printf("经过 zstd 压缩及解压后的数据: %s\n", decompressedData)
}

更多用法见:https://pkg.go.dev/github.com/valyala/gozstd#section-readme

2、编译错误处理

在 windows 系统下编译报错:

D:\...\main>go run main.go
# github.com/valyala/gozstd
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:14:48: undefined: DefaultCompressionLevel
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:31:59: undefined: CDict
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:35:64: undefined: CDict
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:47:20: undefined: Writer
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:56:22: undefined: NewWriterLevel
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:101:61: undefined: DDict
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:110:6: undefined: Reader
C:\Users\Administrator\go\pkg\mod\github.com\valyala\gozstd@v1.21.1\stream.go:117:8: undefined: NewReader

如下图所示: 

经查,在 gozstd 的官方问题列表中,遇到类似的错误,于是尝试着到gozstd包的路径下重编译libzstd.a

cd ../../go/pkg/mod/github.com/valyala/gozstd && make clean libzstd.a

但编译提示 make[2]: cc: No such file or directory,如图:

经查,发现原因是windows系统中没有安装gcc编译器,于是用 cygwin (之前用cygwin安装了make命令)安装相应版本的gcc,结果可以成功 make clean libzstd.a了,如图:

但问题又来了,真是刚踩完一个坑又遇到另一个坑,这次在编译main.go程序时,提示:

# runtime/cgo
gcc_libinit_windows.c: In function '_cgo_beginthread':
gcc_libinit_windows.c:143:27: error: implicit declaration of function '_beginthread'; did you mean '_cgo_beginthread'? [-Werror=implicit-function-declaration]
  143 |                 thandle = _beginthread(func, 0, arg);
      |                           ^~~~~~~~~~~~
      |                           _cgo_beginthread
cc1: all warnings being treated as errors

于是,又开始漫长的搜索之旅,找到别人之前踩过类似的坑,文章地址为:runtime/cgo: gcc_libinit_windows.c:136:27: error: implicit declaration of function '_beginthread' · Issue #59490 · golang/go · GitHub

有人建议删除其他gcc环境,改用tdm-gcc。

于是抱着试一试的态度,下载并安装 tdm-gcc(tdm-gcc), 参考了文章:Windows最好用的gcc/g++编译器Tmdgcc_tdm-gcc-CSDN博客

安装完tdm-gcc后,编译main.go,成功,如图:

 

分析原因:原来gozstd用了c编写,GO项目引用gozstd包后,编译会用到 c 语言编译器,即gcc,之前估计安装的gcc版本问题,导致各种报错。

最终解决方法:安装 tdm-gcc 编译工具!

注:为了测试这个问题,我专门在虚拟机中的centos7系统下安装了go环境,引入gozstd包,在linux环境下编译,一切正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/870591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赋能基层,融合创新:EasyCVR视频汇聚平台构建平安城市视频共享系统

一、雪亮工程建设的意义 雪亮工程的核心在于通过高清视频监控、环境监测和智能预警等先进技术手段,构建一个高效、智能、安全、便捷的社会安全防控体系。这一工程的建设不仅代表了现代化科技手段在城市治安管理中的应用,更是提升社会安全保障能力、推动…

【Angular18】封装自定义组件

1. 准备组件 2. 创建打包文件夹及部分配置文件 创建 文件夹app-legalentities-root拷贝组件源文件到新的文件夹app-legalentities中创建文件 .npmrc registry发布地址always-authtrue创建文件 ng-package.json {"$schema": "./node_modules/ng-packagr/ng-pac…

自动化解决 reCAPTCHA v2:CapSolver 教程

对于那些经常进行网页爬取的人来说,你是否曾觉得 reCAPTCHA v2 就像是互联网版的过于严格的裁判员,总是在质疑你的真实性?但如果你能够轻松且合规地与这些裁判员达成和解,使你的网络搜索和自动化任务变得更顺畅,那该有…

社交媒体分析:如何利用Facebook的数据提升业务决

在数字化时代,社交媒体已经成为企业战略中不可或缺的一部分。Facebook,作为全球最大的社交平台之一,提供了丰富的数据资源,这些数据不仅能够帮助企业了解市场趋势,还能提升业务决策的精准度。本文将探讨如何有效利用Fa…

共享经济背景下校园、办公闲置物品交易平台-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

navicate premium16破解

下载链接:https://pan.baidu.com/s/1BWowOJLYchFcRMgIn-j97A?pwdvmfu 双击安装navicat160_premium_cs_x64.exe,安装完不要打开 然后断网打开NavicatCracker.exe 打开如果报病毒按照下面方法处理: 记得一定要断网,不断网…

安卓相关环境配置

安卓相关环境配置 偶尔更新。。。 JEB(动态调试好用) JEB动态调试Smali-真机/模拟器(详细,新手必看) 夜步城 JADX官网(静态分析) https://github.com/skylot/jadx/releases/tag/v1.5.0 雷…

嵌入式软件--模电基础 DAY 2

强电和弱电,简单一点是以电死人为标准的,交流电36伏特以下,直流电24V以下,为安全电压,是为弱电,反则强电。 市电进入家庭,连接你的电脑,220V的电压为什么没有让你感到危险&#xff…

怎么屏蔽电脑监控软件?企业管理者的智慧选择——精准定位,合理屏蔽,让监控软件成为助力而非障碍!

电脑监控软件在企业管理中扮演着日益重要的角色,它们能够提升工作效率、保障信息安全、预防内部风险。然而,过度或不当使用监控软件也可能引发员工隐私担忧,影响工作积极性和团队氛围。因此,作为企业管理者,如何精准定…

论文创新大杀器!LSTM结合UNet,性能突出,涨点显著

最近,浙大等团队提出了xLSTM-UNet,通过将U-Mamba中的Mamba换成xLSTM,就可以直接提升2D和3D医学图像分割性能,涨点效果显著! xLSTM-UNet是一种结合了LSTM和UNet的混合网络模型,这类模型保留了UNet出色的空间…

迭代器失效

一、什么是迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指…

数据埋点系列 17| 预测分析和预测模型:用数据洞察未来

在数据驱动的决策时代,预测分析和预测模型已成为组织的重要战略工具。通过分析历史数据,我们可以预测未来趋势,做出更明智的决策。本文将深入探讨预测分析的核心概念、常用技术和实际应用。 目录 1. 预测分析的基础1.1 预测分析的类型 2. 高…

Unity与UE,哪种游戏引擎适合你?

PlayStation vs Xbox,Mario vs Sonic,Unreal vs Unity?无论是游戏主机、角色还是游戏引擎,人们总是热衷于捍卫他们在游戏行业中的偏爱。 专注于游戏引擎,Unity和Unreal Engine(简称UE4)是目前市…

C++:平衡二叉搜索树之红黑树

一、红黑树的概念 红黑树, 和AVL都是二叉搜索树, 红黑树通过在每个节点上增加一个储存位表示节点的颜色, 可以是RED或者BLACK, 通过任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树能够确保没有一条路径会比…

C++ 11相关新特性(lambda表达式与function包装器)

目录 lambda表达式 引入 lambda表达式介绍 lambda表达式捕捉列表的传递形式 lambda表达式的原理 包装器 包装器的基本使用 包装器与重载函数 包装器的使用 绑定 C 11 新特性 lambda表达式 引入 在C 98中,对于sort函数来说,如果需要根据不同的比较方式实现…

超网和无类间路由是什么?

​一、超网概述 超网是将多个连续的网络地址组合成一个增加的网络地址的技术。常用于减少路由器的路由表大小,网络的可扩展性。通过合并连续的子网,超网可以减少路由入侵的数量,从而提高网络的效率。 超网的实现基于合并多个具有连续IP地址…

【vue教程】五. Vue 的路由管理

目录 往期列表本章涵盖知识点回顾Vue Router 的基本概念什么是 Vue Router?为什么需要 Vue Router? 路由的配置和使用安装 Vue Router创建路由在 Vue 实例中使用路由模板中的路由链接 动态路由和嵌套路由动态路由嵌套路由 路由守卫什么是路由守卫&#x…

HarmonyOS应用三之组件生命周期和参数传递

目录: 1、生命周期的执行顺序2、页面数据传递3、图片的读取4、数据的备份和恢复5、轮播图6、页面布局图 1、生命周期的执行顺序 /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* yo…

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构(Microservices Architecture)是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务,每个服务都运行在其独立的进程中,服务之间通过轻量级的通信机制&#xff08…

Nginx 核心配置详解

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 配置文件说明 1.1 nginx 配置文件格式说明 1.2 Nginx 主配置文件的配置指令方式: 1.3 主配置文件结构:四部分 1.4 nginx 文件作用解…