如何使用Cygwin编译最新版的Redis源码,生成适用于Windows的Redis

news2025/2/1 0:41:30

文章目录

    • 一、准备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.0

Administrator@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);
            else
                s = 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 jobs
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: 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 bin

Administrator@GC /cygdrive/d/test/redis-7.2.0
$ mv src/*.exe bin

Administrator@GC /cygdrive/d/test/redis-7.2.0
$ cp *.conf bin

Administrator@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均可正常使用;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法:分治思想处理归并递归问题

文章目录 算法原理实现思路典型例题排序数组数组中的逆序对计算右侧小于当前元素的个数 总结 算法原理 利用归并思想进行分治也是很重要的一种思路,在解决逆序对的问题上有很大的需求空间 于是首先归并排序是首先的,归并排序要能写出来: c…

还在苦恼如何开发一个Chrome插件吗?十分钟带你实现一个实用小插件

你是否曾考虑过创建自己的 Chrome 插件,但又挠头毫无思路?那么在接下来的几分钟里,我不仅会介绍 Chrome 浏览器扩展的基本知识,还会指导你通过五个简单的步骤来制作自己的扩展。 知道怎么做吗?让我们一探究竟&#xff…

探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。

文章目录 1. Netflix - 个性化推荐引擎2. Uber - 实时数据分析和决策支持3. Airbnb - 价格预测和优化5. Google - 自然语言处理和搜索优化 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专…

EG1164大功率同步整流升压模块开源,最高效率97%

EG1164大功率同步整流Boost升压电源模块,最高效率97%,输入电压8~50V,输出电压8~60V可调,最大功率300瓦以上,开关频率219kHz。 白嫖了张嘉立创的彩色丝印券就随便画了个板试试,第一次打彩色丝印。 因为我测…

word导出为HTML格式教程,同时也导出图片

在写文档教程时,有时需要借鉴人家的专业文档内容,一般都是word格式文档。word直接复制里面的内容,帐帖到网站编辑器会有很多问题,需要二次清楚下格式才行,而且图片是没办法直接复制到编辑器内的。所以最方便的办法是将…

ARM编程模型-指令流水线

流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。 1. 3级流水线 到ARM7为止的ARM处理器使用简单的3级流水线,它包括下列流水线级。 (1&#xff0…

如何中mac上安装多版本python并配置PATH

摘要 mac 默认安装的python是 python3,但是如果我们需要其他python版本时,该怎么办呢? 例如:需要python2 版本,如果使用homebrew安装会提示没有python2。同时使用python --version 会发现commond not found。 所以本…

linux安装minio以及springboot整合使用

文章目录 1.linux安装minio2.springboot整合minio使用 1.linux安装minio 1.新建文件夹 mkdir /home/minio # 数据文件夹 mkdir /home/minio/data # 创建日志文件夹 mkdir /home/minio/log2.进入文件夹 cd /home/minio3.下载minio,链接可从官网获取 wget https://…

有c语言的基础学习python【python基础详解】

文章将从C语言出发,深入介绍python的基础知识,也包括很多python的新增知识点详解。 目录 1.python的输入输出,重新认识 hello world 1.1 输出函数print的规则 1.2 输入函数input的规则 1.3 用print将数据写入文件 2.数据类型、基本操作…

SPSS统计作图教程:百分条图堆积条图

1、问题与数据 某研究者想看不同年龄分组人群(Age_cat)中不同程度的维生素D缺乏(VD)的百分构成比,部分数据如图1。研究者想以条图形式来展现,该如何操作呢? 图1 部分数据 2. 具体操作&#xf…

不用加减乘除做加法

不用加减乘除做加法 一、描述二、方法 一、描述 写一个函数,求两个整数之和,要求在函数体内不得使用、-、*、/四则运算符号,本题OJ链接 数据范围:两个数都满足 −10≤n≤1000 进阶:空间复杂度 O(1),时间复…

构造函数和析构函数(个人学习笔记黑马学习)

构造函数:主要作用在于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编译器自动调用&#xff0c;无须手动调用。析构函数:主要作用在于对象销毁前系统自动调用&#xff0c;执行一些清理工作。 #include <iostream> using namespace std;//对象初始化和清理class…

MVC,MVP,MVVM的理解和区别

MVC MVC &#xff0c;早期的开发架构&#xff0c;在安卓里&#xff0c;用res代表V&#xff0c;activity代表Controller层&#xff0c;Model层完成数据请求&#xff0c;更新操作&#xff0c;activity完成view的绑定&#xff0c;以及业务逻辑的编写&#xff0c;更新view&#xf…

2359. 找到离给定两个节点最近的节点;1781. 所有子字符串美丽值之和;2406. 将区间分为最少组数

2359. 找到离给定两个节点最近的节点 核心思想:统计node1和node2分别到每个点的距离&#xff0c;然后在枚举每个点统计结果。关键在于如何统计node到每个点的距离&#xff0c;首先是初始化为inf很重要&#xff0c;因为在枚举的时候&#xff0c;因为是inf代表了这个节点无法到达…

MVC模式分层练习

新建库 新建表 插入点数据 先不用MVC模式写功能,来看下缺点是什么 新建一个空项目 选项项目使用的JDK 自己的IDEA总是要重启下 新建模块 因maven还没教 添加框架支持 添加后项目多了这些 添加些必要依赖 这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问…

设计模式-2--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象&#xff0c;而无需暴露对…

yolov5 应用整理

yolov5 应用整理 适用于0基础人员与有一定yolov5了解的人员食用. 关于yolov5参考: yolov5 github源码链接 目前参与过yolov5的应用: 平台库x86/arm cpuncnnx86libtorch/pytorchBM1684算能标准库(需要进行模型转换)昇腾cann(ascend api) https://gitee.com/Tencent/ncnn ht…

在windows下安装配置skywalking

1.下载地址 Downloads | Apache SkyWalkinghttp://skywalking.apache.org/downloads/ 2.文件目录说明 将文件解压后&#xff0c;可看到agent和bin目录&#xff1a; Agent&#xff1a;作为探针&#xff0c;安装在服务器端&#xff0c;进行数据采集和上报。 Config&#xff1a…

车联网仿真工具Veins安装指南(基于官方文档)

Veins安装指南 官方文档&#xff1a; tutorial 直接选择最easy的way&#xff1a; 下载一个虚拟机&#xff1a;VMware Workstation Player 下载即可。这个普通版是免费的&#xff0c;pro版正版是要收费的&#xff0c;可以找一些其他的方法下载pro版本&#xff0c;可以同时开…

windows11 利用vmware17 安装rocky9操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ​ rocky8镜像下载 官网链接&#xff1a;Rocky Linux 下载页面 Download Rocky | Rocky Linux 点击Minimal下载 安装rocky9 选择镜像文件&#xff0c;点击下一步 点击下一步 启动虚拟机 选…