如何使用Cygwin编译最新版的Redis源码,生成适用于Windows的Redis
文章目录
- 一、准备Cygwin环境
- 二、下载Redis源码
- 三、编译redis-7.2.0
- 1. 执行make命令
- 2. 重新执行make命令
- 3. 再次执行make命令
- 4. 将编译后的可执行文件及依赖放到同一个文件夹
- 5. 测试编译生成的可执行程序
- 四、换其他redis版本重新编译
- 1. 编译redis-7.0.12
- 2. 编译redis-6.2.13
- 3. 编译redis-7.2.rc3、redis-7.2-rc2
- 五、总结
如果你不想那么麻烦自己编译redis,你可参考我的另一篇文章:
Windows 下 Redis 安装与配置 教程
接下来演示如何使用Cygwin工具,编译redis源码,生成适用于Windows的Redis(其中包含编译过程中遇到的问题及解决方案)
先说结论:
redis-7.2.0编译后生成的redis-server不可用
redis-7.0.12、redis-6.2.13 编译后生成的redis-cli、redis-server 经测试均可用
一、准备Cygwin环境
Cygwin安装这里就不介绍了,请参考:
Cygwin 介绍与安装
Cygwin 配置C/C++编译环境以及如何编译项目
我本地Cygwin安装的软件包如下,其中 make、gcc-core、gcc-g++、pkg-config、tcl 建议这几个都装上。

找到Cygwin安装目录下的usr\include\dlfcn.h文件,修改如下代码,将#if __GNU_VISIBLE、#endif 这两行注释掉。(使用// 或 /* 被注释代码*/ 方式进行注释)
//#if __GNU_VISIBLE
typedef struct Dl_info Dl_info;struct Dl_info
{char dli_fname[PATH_MAX]; /* Filename of defining object */void *dli_fbase; /* Load address of that object */const char *dli_sname; /* Name of nearest lower symbol */void *dli_saddr; /* Exact value of nearest symbol */
};extern int dladdr (const void *addr, Dl_info *info);
//#endif
二、下载Redis源码
redis源码下载地址:redis/redis/releases

如果访问Github较慢,提供如下解决方案:
作为程序员不得不知道的几款Github加速神器
三、编译redis-7.2.0
先编译一个目前的最新版本,试试水
1. 执行make命令
在redis-7.2.0项目根目录,执行make命令
比如我redis解压后的地址: d:/test/redis-7.2.0
Administrator@GC ~
$ cd d:/test/redis-7.2.0Administrator@GC /cygdrive/d/test/redis-7.2.0
$ make
当然一般没那么顺利,看报错:
MAKE hiredis
cd hiredis && make static
make[3]: Entering directory '/cygdrive/d/test/redis-7.2.0/deps/hiredis'
cc -std=c99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic alloc.c
cc -std=c99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic net.c
cc -std=c99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic hiredis.c
cc -std=c99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic sds.c
In file included from sds.c:37:
sds.c: In function ‘hi_sdscatrepr’:
sds.c:889:25: error: array subscript has type ‘char’ [-Werror=char-subscripts]889 | if (isprint(*p))| ^~
cc1: all warnings being treated as errors
make[3]: *** [Makefile:270: sds.o] Error 1
make[3]: Leaving directory '/cygdrive/d/test/redis-7.2.0/deps/hiredis'
make[2]: *** [Makefile:55: hiredis] Error 2
make[2]: Leaving directory '/cygdrive/d/test/redis-7.2.0/deps'
make[1]: [Makefile:384: persist-settings] Error 2 (ignored)
解决方案:
方案1:修改hiredis的Makefile
WARNINGS=-Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers
找到这行代码(42行),删掉-Werror
方案2:修改sds.c文件
default:if (isprint((int)*p))s = hi_sdscatprintf(s,"%c",*p);elses = hi_sdscatprintf(s,"\\x%02x",(unsigned char)*p);break;}
找到889行(报错的那行sds.c:889:25: error: array subscript has type ‘char’ [-Werror=char-subscripts])
将if (isprint(*p))改为if (isprint((int)*p)),做一个强制转换。
2. 重新执行make命令
make clean
make
重新编译之前先执行一下make clean
还是没那么顺利,看报错👇
LINK redis-server
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: cannot find ../deps/hiredis/libhiredis.a: No such file or directory
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: cannot find ../deps/lua/src/liblua.a: No such file or directory
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: cannot find ../deps/hdr_histogram/libhdrhistogram.a: No such file or directory
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: cannot find ../deps/fpconv/libfpconv.a: No such file or directory
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:403: redis-server] Error 1
make[1]: Leaving directory '/cygdrive/d/test/redis-7.2.0/src'
make: *** [Makefile:6: all] Error 2
解决方案:
cd deps && make hiredis lua hdr_histogram fpconv jemalloc linenoise
进入到deps目录,对deps下报错的子项目,进行单独编译。
如果没有再报错,则继续往下(我这里没有再次报错了(忽略Warning信息))
3. 再次执行make命令
cd .. && make
回到redis项目根目录,再次执行make命令
Administrator@GC /cygdrive/d/test/redis-7.2.0/deps
$ cd .. && make
cd src && make all
make[1]: Entering directory '/cygdrive/d/test/redis-7.2.0/src'LINK redis-cli
lto-wrapper: warning: using serial compilation of 3 LTRANS jobsCC redis-benchmark.oLINK redis-benchmarkINSTALL redis-check-rdbINSTALL redis-check-aofHint: It's a good idea to run 'make test' ;)make[1]: Leaving directory '/cygdrive/d/test/redis-7.2.0/src'
然后成功了,很开心。
4. 将编译后的可执行文件及依赖放到同一个文件夹
Administrator@GC /cygdrive/d/test/redis-7.2.0
$ mkdir binAdministrator@GC /cygdrive/d/test/redis-7.2.0
$ mv src/*.exe binAdministrator@GC /cygdrive/d/test/redis-7.2.0
$ cp *.conf binAdministrator@GC /cygdrive/d/test/redis-7.2.0
$ cp /usr/bin/cygwin1.dll bin
将src目录下编译生成的*.exe可执行程序,源码根目录下的redis.conf、sentinel.conf等,以及依赖的Cygwin安装目录下的bin目录下的cygwin1.dll,都放到同一个文件夹下。
如下所示:

5. 测试编译生成的可执行程序
打开一个cmd窗口,切换到上述发布redis的目录下,然后执行redis-server命令

兄弟们,我很难过呀,报错啦~

redis-server没有启动成功,生成一个redis-server.exe.stackdump文件。
我不懂这个呀,有懂得兄弟可以给我科普下。
再测试下redis-cli

看起来 redis-cli 是可以正常使用的。
四、换其他redis版本重新编译
1. 编译redis-7.0.12
鉴于我不甘心,我换了个redis-7.0.12版本,重新编译下看看。
编译步骤我就不重复了,直接说结果。
项目下载下来后,没有修改redis项目的任何代码,直接在根目录下执行make命令,一次成功!
启动 redis-server

使用redis-cli连接redis

讲真,你能说官方发布的redis-7.2.0有问题吗?不能够吧,毕竟那么大个项目,那么多人在维护和测试。只能说这个版本可能在Windows环境下编译有问题。
(注意我说的是可能,也许其他人能成功呢,要勇于尝试。)
2. 编译redis-6.2.13
然后,我又尝试了 redis-6.2.13 版本,也是一次成功,并且redis-server、redis-cli 都可正常执行。
3. 编译redis-7.2.rc3、redis-7.2-rc2
我还尝试了 redis-7.2-rc3、redis-7.2-rc2 ,也能编译成功,但同redis-7.2.0 一样,redis-server启动时报错。
五、总结
如上尝试了多个redis版本编译。结果总结如下:
redis-7.2各版本,可成功编译,但编译生成的可执行文件中,redis-server.exe执行时报错不可用;redis-7.0.12版本,可成功编译,且redis-cli、redis-server均可正常使用;redis-6.2.13版本,可成功编译,且redis-cli、redis-server均可正常使用;
相关文章:
如何使用Cygwin编译最新版的Redis源码,生成适用于Windows的Redis
文章目录 一、准备Cygwin环境二、下载Redis源码三、编译redis-7.2.01. 执行make命令2. 重新执行make命令3. 再次执行make命令4. 将编译后的可执行文件及依赖放到同一个文件夹5. 测试编译生成的可执行程序 四、换其他redis版本重新编译1. 编译redis-7.0.122. 编译redis-6.2.133.…...
Linux 修改SSH端口
如果防火墙,或防火墙已经开启,需要先开放2222端口 firewall-cmd --add-port2222/tcp --permanent --zonepublic firewall-cmd --reload编辑文件 vim /etc/ssh/sshd_config: #Port 22 Port 2222 # 打开注释,并修改为以下值 Clien…...
Redis经典问题:缓存穿透
(笔记总结自《黑马点评》项目) 一、产生原因 用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力。 常见的解决方式有缓存空对象和布隆过滤器。 二、缓存空对象 思路:当我们客户…...
DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION (论文解析)
DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 摘要1 介绍2 相关工作3 重新审视 Transformers 和 DETR4 方法4.1 用于端到端目标检测的可变形transformer4.2 Deformable Detr的其他改进和变型5 实验5.1 和DETR 比较5.2 消融实验5.3 与最先进方法的…...
网络连接评分机制之NetworkFactory
在开机时,各个提供网络连接的对象需要向ConnectivityService注册自己,并把自己所提供的网络的分值告诉ConnectivityService。 为了ConnectivityService便于统一管理,每一个具备提供网络服务的对象都需要创建一个NetworkFactory的子类对象,并利用该对象注册自己,以及提供自…...
极致精细的jmeter+ant+jenkins 搭建接口自动化测试
一、jmeter 相信大家对jmeter并不陌生哈,如果没有安装和配置环境的小伙伴,可以直接找到我哈,我发给你。 二、ant 安装ant 第一步:下载ant http://ant.apache.org/ 第二步:配置ant window中设置ant环境变量&…...
Unity物体查找方式
参考资料 cUnity中使用GameObject.Find、Transform.Find查找GameObject_思月行云的博客-CSDN博客 GameObject.Find 通过名字或路径查找游戏对象。 GameObject.Find("GameObject"); GameObject.Find("GameObject/ChildGameObject); 使用规范: 1.无法查找隐藏…...
【Spring容器的启动流程】
Spring容器的启动流程主要分为以下几个步骤: 加载配置文件:Spring容器会从指定的配置文件中读取配置信息,包括bean的定义、依赖关系、AOP切面等。 创建容器:Spring容器启动后会创建一个容器实例,容器负责管理bean的生…...
Python---字符串
字符串特点 1. 只可以存储字符串 2. 长度任意 (取决于内存大小) 3. 支持下标索引 4. 允许重复字符串存在 5. 不可以修改 (增加或删除元素等) 6. 支持for和while循环 字符串的下标索引 # 字符串的下标索引 从前向后,下标从0开始 从后向前,下标从-1开始…...
MySQL数据 - 索引
MySQL数据库 - 索引 1:什么是数据库索引?2:都有哪些类型的索引呢?3:MySQL数据库每种索引的底层实现原理,每种索引为什么这么实现?4:上面索引实现基本上是B+树,为什么不用别的数据结构呢?4-1:那为什么不是二叉树呢?4-2:为什么不是红黑树呢?4-3:为什么不是哈希索引…...
长安链BaaS服务平台调研
目录 一、菜单功能二、其他说明2.1、服务平台的部署方式2.2、链本身2.3、建链流程2.4、支持连接已部署的链2.5、链治理投票2.6、支持动态节点操作2.7、支持应用 长安链ChainMaker管理平台文档地址:https://docs.chainmaker.org.cn 一、菜单功能 菜单子菜单/功能点…...
怎么关闭php错误提示?两者方法分享
PHP程序员在开发过程中经常会遇到各种错误。为了方便查错,PHP默认会输出错误提示。但在生产环境中,这些错误提示信息不仅可能暴露你的代码结构,还会影响网站的性能和安全性。因此,关闭 PHP 的错误提示信息是一个很有必要并且很简单…...
Android Aidl跨进程通讯(三)--进阶使用
学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为2478字,预计阅读6分钟 前言 Android的AIDL使用和异常报错都已经介绍过了,今天这篇还是在原来的Demo基础上加入几个AIDL的进阶使用方法。 】 AIDL进阶使用 微卡智享 in,out,inout的使…...
vue.js+nodejs家庭个人理财收支管理系统5x6nf
本收支管理系统以vue.js作为框架,nodejs语言,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:用户管理、收入分类、支出分类、每日收入、每日支出等模块。 本文的组织结构如下: 1、绪论。综述了本文的研究背景…...
怎样去掉win11快捷方式的小箭头
前有创造注册表新值的方法,现在有了注册表加文件的方法 开始 先下载这个文件,里面有要用到的信息 下载 保存文件到电脑,并解压 有两个文件, 一个是 Remove_shortcut_arrow_icon.reg 一个是blank.ico 把第二个文件移动到 C:\Windows 文件夹, 然后点击打开文件, 如果提示是…...
Django项目如何配置日志文件信息
1、以dict的方式配置在settings.py中 # 日志文件简单配置LOGGING {"version": 1,"disable_existing_loggers": False,"handlers": {"file": {"level": "DEBUG","class": "logging.FileHandler&…...
遇到一个异步任务后是否会直接加入到异步队列当中
在javascript中,异步任务不会立即加入到异步队列(任务队列)中,而是根据不同的异步操作类型和执行环境,将对应的回调函数函数或事件加入到不同的队列中 javascript中常见的异步操作包括: 定时器࿱…...
SUSE Linux文件系统在线扩容
前几天巡检发现,SUSE 12文件系统/vg01下面的某个文件空间不足,挂载点是/oracle,容量不够,需要进行扩容。 新的空间是从一台HP的存储上新映射的。由于映射的LUN是从windows主机上回收,然后直接映射的,所以在linux识别新…...
智能电话机器人的出现,能够解决哪些问题?
经济的繁荣与高速的发展,使得电销这个方式快速地融合在房地产与金融投资等大部分行业上。在电销人员与客户的沟通上,难免会出现很多问题,毕竟所面对的客户都是各行各业,他们有着不同的经历和身份。 对于时常需要处理客户投诉、安…...
16-数据结构-图的存储结构
简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
