当前位置: 首页 > news >正文

如何使用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.12redis-6.2.13 编译后生成的redis-cliredis-server 经测试均可用

一、准备Cygwin环境

Cygwin安装这里就不介绍了,请参考:
Cygwin 介绍与安装
Cygwin 配置C/C++编译环境以及如何编译项目

我本地Cygwin安装的软件包如下,其中 makegcc-coregcc-g++pkg-configtcl 建议这几个都装上。

Cygwin 已安装软件包

找到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
redis源码下载

如果访问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.confsentinel.conf等,以及依赖的Cygwin安装目录下的bin目录下的cygwin1.dll,都放到同一个文件夹下。

如下所示:
在这里插入图片描述

5. 测试编译生成的可执行程序

打开一个cmd窗口,切换到上述发布redis的目录下,然后执行redis-server命令
在这里插入图片描述
兄弟们,我很难过呀,报错啦~
报错啦
redis-server没有启动成功,生成一个redis-server.exe.stackdump文件。
我不懂这个呀,有懂得兄弟可以给我科普下。

再测试下redis-cli
redis-cli命令
看起来 redis-cli 是可以正常使用的。

四、换其他redis版本重新编译

1. 编译redis-7.0.12

鉴于我不甘心,我换了个redis-7.0.12版本,重新编译下看看。
编译步骤我就不重复了,直接说结果。

项目下载下来后,没有修改redis项目的任何代码,直接在根目录下执行make命令,一次成功!

启动 redis-server
redis-server
使用redis-cli连接redis
redis-cli

讲真,你能说官方发布的redis-7.2.0有问题吗?不能够吧,毕竟那么大个项目,那么多人在维护和测试。只能说这个版本可能在Windows环境下编译有问题。
(注意我说的是可能,也许其他人能成功呢,要勇于尝试。)

2. 编译redis-6.2.13

然后,我又尝试了 redis-6.2.13 版本,也是一次成功,并且redis-serverredis-cli 都可正常执行。

3. 编译redis-7.2.rc3、redis-7.2-rc2

我还尝试了 redis-7.2-rc3redis-7.2-rc2 ,也能编译成功,但同redis-7.2.0 一样,redis-server启动时报错。

五、总结

如上尝试了多个redis版本编译。结果总结如下:

  1. redis-7.2各版本,可成功编译,但编译生成的可执行文件中,redis-server.exe 执行时报错不可用;
  2. redis-7.0.12版本,可成功编译,且redis-cliredis-server均可正常使用;
  3. redis-6.2.13版本,可成功编译,且redis-cliredis-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中常见的异步操作包括: 定时器&#xff1…...

SUSE Linux文件系统在线扩容

前几天巡检发现,SUSE 12文件系统/vg01下面的某个文件空间不足,挂载点是/oracle,容量不够,需要进行扩容。 新的空间是从一台HP的存储上新映射的。由于映射的LUN是从windows主机上回收,然后直接映射的,所以在linux识别新…...

智能电话机器人的出现,能够解决哪些问题?

经济的繁荣与高速的发展,使得电销这个方式快速地融合在房地产与金融投资等大部分行业上。在电销人员与客户的沟通上,难免会出现很多问题,毕竟所面对的客户都是各行各业,他们有着不同的经历和身份。 对于时常需要处理客户投诉、安…...

16-数据结构-图的存储结构

简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

OpenLayers 可视化之热力图

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...