网页制作与网站建设宝典 pdf,东莞网站建设分享seo,最好的app制作公司,网站建设.c文章目录 一、准备Cygwin环境二、下载Redis源码三、编译redis-7.2.01. 执行make命令2. 重新执行make命令3. 再次执行make命令4. 将编译后的可执行文件及依赖放到同一个文件夹5. 测试编译生成的可执行程序 四、换其他redis版本重新编译1. 编译redis-7.0.122. 编译redis-6.2.133.… 文章目录 一、准备Cygwin环境二、下载Redis源码三、编译redis-7.2.01. 执行make命令2. 重新执行make命令3. 再次执行make命令4. 将编译后的可执行文件及依赖放到同一个文件夹5. 测试编译生成的可执行程序 四、换其他redis版本重新编译1. 编译redis-7.0.122. 编译redis-6.2.133. 编译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
AdministratorGC ~
$ cd d:/test/redis-7.2.0AdministratorGC /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 -stdc99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic alloc.c
cc -stdc99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic net.c
cc -stdc99 -c -O3 -fPIC -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb -pedantic hiredis.c
cc -stdc99 -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’ [-Werrorchar-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’ [-Werrorchar-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命令
AdministratorGC /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/srcLINK redis-cli
lto-wrapper: warning: using serial compilation of 3 LTRANS jobsCC redis-benchmark.oLINK redis-benchmarkINSTALL redis-check-rdbINSTALL redis-check-aofHint: Its a good idea to run make test ;)make[1]: Leaving directory /cygdrive/d/test/redis-7.2.0/src然后成功了很开心。
4. 将编译后的可执行文件及依赖放到同一个文件夹
AdministratorGC /cygdrive/d/test/redis-7.2.0
$ mkdir binAdministratorGC /cygdrive/d/test/redis-7.2.0
$ mv src/*.exe binAdministratorGC /cygdrive/d/test/redis-7.2.0
$ cp *.conf binAdministratorGC /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均可正常使用