1. Windows平台下如何编译C++版本的Redis库hiredis

2023-10-12 08:01

本文主要是介绍1. Windows平台下如何编译C++版本的Redis库hiredis,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

    Redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。

    从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

1、下载redis源码

GitHub - microsoftarchive/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes

2、编译代码

    推荐使用VS2013,打开目录中的redis-3.0\msvs\RedisServer.sln,编译即可,如果提示以下错误,需要适当修改代码,后面的依次类推:

1>..\..\src\ae.c(187): error C2275: “aeFileEvent”: 将此类型用作表达式非法
1>          c:\users\administrator\desktop\redis-3.0\src\ae.h(67) : 参见“aeFileEvent”的声明
1>..\..\src\ae.c(187): error C2065: “fe”: 未声明的标识符
1>..\..\src\ae.c(189): error C2065: “fe”: 未声明的标识符
1>..\..\src\ae.c(189): error C2223: “->mask”的左侧必须指向结构/联合

比如编译会出现报错的函数:

int aeGetFileEvents(aeEventLoop *eventLoop, int fd) {if (fd >= eventLoop->setsize) return 0;aeFileEvent *fe = &eventLoop->events[fd];return fe->mask;
}

由于C文件编译器中限定变量需要放在最前面函数体中间不允许临时定义变量,故参照下面的方式修改即可:

int aeGetFileEvents(aeEventLoop *eventLoop, int fd) {aeFileEvent *fe = NULL;if (fd >= eventLoop->setsize) return 0;fe = &eventLoop->events[fd];return fe->mask;
}

修改完毕后重新编译即可!

3、生成静态lib文件

    生成的文件位于:redis-3.0\msvs\Win32\Release,如下图,在后续工程中只需要引用此LIB即可在VS C++环境中编译你的应用:

4、运行Redis服务端:

    先将配置文件redis-3.0\redis.conf拷贝上面的EXE所在目录:

通常只需要修改redis.conf中的几个常用参数

# 侦听端口(默认)
port 6379# 数据库本地的文件名
dbfilename dump.rdb# 修改访问密码
################################## SECURITY ###################################
requirepass admin

最后在命令行运行 redis-server.exe redis.conf 即可启动服务端:

下一章节将讲解在Redis常见命令及对比MySQL细节!

注意:

由于hiredis是在VS2013编译生成的,否则测试工程必须要用VS2013或以上的版本,否则会提示下面的错误:

1>  所有输出均为最新。
1>MSVCRTD.lib(ti_inst.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xlock.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(stdthrow.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xthrow.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(uncaught.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(locale0.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xdebug.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(ios.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(cerr.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(iosptrs.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xmutex.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>hiredis.lib(hiredis.obj) : error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _redisvFormatCommand 中被引用
1>Win32_Interop.lib(Win32_Error.obj) : error LNK2001: 无法解析的外部符号 ___report_rangecheckfailure
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2001: 无法解析的外部符号 ___report_rangecheckfailure
1>Win32_Interop.lib(Win32_ANSI.obj) : error LNK2001: 无法解析的外部符号 ___report_rangecheckfailure
1>hiredis.lib(hiredis.obj) : error LNK2019: 无法解析的外部符号 __vacopy,该符号在函数 _redisvFormatCommand 中被引用
1>hiredis.lib(sds.obj) : error LNK2001: 无法解析的外部符号 __vacopy
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2019: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ),该符号在函数 "char * __cdecl std::_Allocate<char>(unsigned int,char *)" (??$_Allocate@D@std@@YAPADIPAD@Z) 中被引用
1>Win32_Interop.lib(win32_rfdmap.obj) : error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)
1>Win32_Interop.lib(Win32_variadicFunctor.obj) : error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2019: 无法解析的外部符号 "char const * __cdecl std::_Syserror_map(int)" (?_Syserror_map@std@@YAPBDH@Z),该符号在函数 "public: virtual class std::error_condition __thiscall std::_System_error_category::default_error_condition(int)const " (?default_error_condition@_System_error_category@std@@UBE?AVerror_condition@2@H@Z) 中被引用
1>Win32_Interop.lib(Win32_variadicFunctor.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Syserror_map(int)" (?_Syserror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Syserror_map(int)" (?_Syserror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2019: 无法解析的外部符号 "char const * __cdecl std::_Winerror_map(int)" (?_Winerror_map@std@@YAPBDH@Z),该符号在函数 "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::_System_error_category::message(int)const " (?message@_System_error_category@std@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@H@Z) 中被引用
1>Win32_Interop.lib(Win32_variadicFunctor.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Winerror_map(int)" (?_Winerror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Winerror_map(int)" (?_Winerror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2019: 无法解析的外部符号 "void __cdecl std::_Facet_Register(class std::_Facet_base *)" (?_Facet_Register@std@@YAXPAV_Facet_base@1@@Z),该符号在函数 "class std::ctype<char> const & __cdecl std::use_facet<class std::ctype<char> >(class std::locale const &)" (??$use_facet@V?$ctype@D@std@@@std@@YAABV?$ctype@D@0@ABVlocale@0@@Z) 中被引用
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2019: 无法解析的外部符号 "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(bool)" (?_Init@locale@std@@CAPAV_Locimp@12@_N@Z),该符号在函数 "public: __thiscall std::locale::locale(void)" (??0locale@std@@QAE@XZ) 中被引用
1>Win32_Interop.lib(Win32_Time.obj) : error LNK2019: 无法解析的外部符号 __dtoul3,该符号在函数 _GetHighResRelativeTime 中被引用
1>Win32_Interop.lib(Win32_Time.obj) : error LNK2019: 无法解析的外部符号 __ltod3,该符号在函数 _GetHighResRelativeTime 中被引用
1>C:\Users\Administrator\Desktop\RedisTest\Debug\RedisTest.exe : fatal error LNK1120: 9 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:01.53
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

避坑指南:这个版本似乎不太稳定,主进程EXE这些推荐使用官方的版本,在此我们只需要用它的lib库即可!

这篇关于1. Windows平台下如何编译C++版本的Redis库hiredis的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194457

相关文章

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函