文章目录
- 一、准备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.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.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
均可正常使用;