Windows 7下vc2010编译使用redis 3.0
项目中,有多台机器频繁读写、同步一些参数。起初的方案是通过MySQL的临时表实现,对效率有一些影响,故改为redis方案。项目中redis和web、mysql是linux平台,客户端是windows 7平台C++应用进程、操作LoRa等硬件设备。
1. 编译hiredis
按网络上多篇博文的描述,C++环境下访问redis需要使用hiredis库。从下载的redis3.0源代码中发现,hiredis已集成在了项目中,如下是redis3.0的目录结构:
├─deps
├─msvs
│ ├─hiredis
│ ├─lua
│ ├ ……
│ ├─Samples
│ ├─setups
│ └─tools
├─src
│ └─Win32_Interop
├─tests
└─utils
其中,msvc目录下有个hiredis.vcxproj文件,src目录下有Win32_Interop.vcxproj文件,这两个是C++客户端需要调用的库文件。
注意,这两个.vcxproj工程是vc2012版本的,源码使用了一些Cxx11的语法,如自动推导、变长参数模板、常量成员赋值等,因此,需要对源代码做一些小改动。
1.1 编译Win32_Interop.vcxproj
添加到解决方案中,然后,在“属性->平台属性->常规”中将“平台工具集”由v120变更为v100,“配置类型”为“静态库(.lib)”;
编译,报告大量的编译错误。别紧张,这些错误其实都有共性,用vim正则表达式替换下就好。
(1) 对vector直接初始化赋值的小改动
Win32_CommandLine.cpp中,有如下代码:
static RedisParamterMapper g_redisArgMap = {...};
解决:
写个loader类,在其构造函数中对该变量赋值,然后,定义一个全局的loader变量,例如;
class g_redisArgMap_loader {
public:
g_redisArgMap_loader()
{
// QFork flags
g_redisArgMap.insert(std::pair<string, ParamExtractor*>(cQFork, &fp2)); // qfork [QForkControlMemoryMap handle] [parent process id]
...
}
...
};
static g_redisArgMap_loader g_redisArgMap_loader_object =