# windows下C++編譯配置hiredis的方法(VS2017)
2018年03月](https://me.csdn.net/weixin_39684284)
https://blog.csdn.net/weixin\_39684284/article/details/79571254
* * [前言](https://blog.csdn.net/weixin_39684284/article/details/79571254#前言)
* [開始](https://blog.csdn.net/weixin_39684284/article/details/79571254#開始)
* [環境說明](https://blog.csdn.net/weixin_39684284/article/details/79571254#環境說明)
* [開始配置](https://blog.csdn.net/weixin_39684284/article/details/79571254#開始配置)
* [Redis編譯安裝](https://blog.csdn.net/weixin_39684284/article/details/79571254#redis編譯安裝)
* [hiredis的編譯配置](https://blog.csdn.net/weixin_39684284/article/details/79571254#hiredis的編譯配置)
* [程序樣例](https://blog.csdn.net/weixin_39684284/article/details/79571254#程序樣例)
## 前言
最近在學習redis的使用,以及在windows下通過C++連接redis服務器進行操作。在參考了幾篇博客,又自己處理許多編譯錯誤的問題,終于將hiredis客戶端配置成功了,特此記錄,方便查看。
## 開始
### 環境說明
編譯器:Visual Studio 2017;
redis客戶端:[github上hiredis的windows版](https://github.com/MicrosoftArchive/redis)
版本:直接點擊下載[win3.2.100](https://github.com/MicrosoftArchive/redis/archive/win-3.2.100.zip)
> 在這塊需要說明的是,我使用的是3.2.100版本的hiredis客戶端,對于其他版本的,沒有嘗試,不過感覺大致思路應該是一致的
### 開始配置
> 這里主要講述從redis的編譯安裝到使用hiredis進行C++程序的過程,如果只需要hiredis的配置使用,可略過redis的編譯部分
#### Redis編譯安裝
> 以下是Redis的編譯安裝,如果感覺麻煩的話,可以直接下載redis的windows安裝包進行安裝:地址:[Redis-x64-3.2.100.msi](https://github.com/MicrosoftArchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi)
> 如果上述地址無法下載可以選擇這個:[Redis-x64-3.2.100.msi](https://download.csdn.net/download/weixin_39684284/10288873)
* 解壓下載下來的`win-3.2.100.zip`,進入到目錄`redis-win-3.2.100\msvs\`中,打開`RedisServer.sln`
> 第一次打開的時候VS2017會檢測解決方案工具集,提示升級,點擊確定即可,將工具集升級到最新或者下載對于的v120工具集
> 
* 在解決方案資源管理右鍵解決方案,點擊生成。
> 需要注意的是,要注意編譯設置是debug還是release,是x86還是x64。使用debug編譯在出錯的時候好調試一些。我選擇的是debug x64的編譯配置。此時會出現一系列的警告之類的,不用管,等待完成編譯完成就可以了。出現錯誤就解決。不過3.2.100版本在VS2017下,應該是能夠順利生成的(可能是我運氣好?)
* 經過一系列的警告,最終在目錄`redis-win-3.2.100\msvs\x64\Debug`里面生成了一些靜態庫文件和exe文件
> EXE文件 分別是redis-benchmark.exe,redis-check-aof.exe,redis-check-dump.exe,redis-cli.exe,redis-server.exe;把5個EXE復制到自己新建redis的目錄下即可,它們的作用如下:
> redis-server:Redis服務器的daemon啟動程序
> redis-cli:Redis命令行操作工具。也可以用telnet根據其純文本協議來操作
> redis-benchmark:Redis性能測試工具,測試Redis在當前系統下的讀寫性能
> redis-check-aof:數據修復
> redis-check-dump:檢查導出工具
> *來源:[https://www.cnblogs.com/raker/p/4368741.html](https://www.cnblogs.com/raker/p/4368741.html)*
* 在命令行界面找到redis的目錄,運行redis-server.exe開啟服務。redis-cli.exe連接服務。詳細命令可以查看[redis命令中心](https://redis.io/topics/rediscli)
#### hiredis的編譯配置
* 在Redis的編譯安裝中,我們編譯redis服務的時候,已經編譯了hiredis。當然也可以自行重新編譯hiredis,只需要右鍵`hiredis`工程和`Win32_Interop`工程,分別點擊生成`hiredis.lib`和`Win32_Interop.lib`即可。
* 在`\redis-win-3.2.100\msvs\x64\Debug`目錄中可以看到兩個靜態鏈接庫文件:`**hiredis.lib`和`Win32_Interop.lib**`, 至此,我們需要的文件和鏈接庫都有了,接下來就是怎么配置使用的問題了。
**
* 新建一個項目,打開【項目屬性】對話框,選擇【VC++目錄】,在【包含目錄】中增加我們下載下來的源碼的頭文件存放的位置,相對路徑為:`redis-win-3.2.100\src` 和 `\redis-win-3.2.100\deps\hiredis`。這兩個文件夾里包含了hiredis需要使用的頭文件和c文件。
* 在【庫目錄】中選擇我們靜態鏈接庫存放的位置`\redis-win-3.2.100\msvs\x64\Debug`
> 注意,上面的路徑都是相對路徑,在操作過程中,需要通過文件選擇對話框完成路徑的增加,為絕對路徑。這些文件路徑是可以改變的,只要文件夾里包含的文件沒變即可。可以將這些頭文件放在一個目錄中統一包含也行。
* 在【鏈接器】>>【輸入】中,選擇【附加依賴項】,在其中增加之前編譯的鏈接庫文件`**hiredis.lib`,`Win32_Interop.lib**`,用回車來分割即可。
* 至此,hiredis的配置就算完成了,可以輸入下面的樣例運行一下。
> 需要了解的是,一些教程中說到,還需要將`redis-win-3.2.100\src\Win32_Interop`目錄下的`win32fixes.c` 放入項目的目錄與main.cpp同級,經過測試后發現,其實不放入也不影響使用,如果出現相關問題,可以嘗試將該文件放入項目目錄中。
#### 程序樣例
~~~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h> //頭文件跟隨文件存放路徑改變
#include <Win32_Interop\win32fixes.h> //頭文件跟隨文件存放路徑改變
#pragma comment(lib,"hiredis.lib")
#pragma comment(lib,"Win32_Interop.lib")
int main() {
redisContext *redis = redisConnect("127.0.0.1", 6379);
if (redis == NULL || redis->err) {
if (redis) {
printf("Error: %s\n", redis->errstr);
// handle error
}
else {
printf("Can't allocate redis context\n");
}
}
else {
printf("connect successed!");
}
redisReply *reply;
/* PING server */
reply = (redisReply *)redisCommand(redis, "PING");
printf("PING: %s\n", reply->str);
freeReplyObject(reply);
reply = (redisReply *)redisCommand(redis, "SET %b %b", "foo", (size_t)3, "ss", (size_t)2);
printf("foo: %s\n", reply->str);
freeReplyObject(reply);
redisFree(redis);
system("pause");
return 0;
}
~~~
```
redisContext *redis = redisConnect("127.0.0.1", 6379);
if (redis == NULL || redis->err) {
if (redis) {
printf("Error: %s\n", redis->errstr);
// handle error
}
else {
printf("Can't allocate redis context\n");
}
}
else {
printf("connect successed!");
}
redisReply *reply;
/* PING server */
reply = (redisReply *)redisCommand(redis, "PING");
printf("PING: %s\n", reply->str);
freeReplyObject(reply);
reply = (redisReply *)redisCommand(redis, "SET %b %b", "foo", (size_t)3, "ss", (size_t)2);
printf("foo: %s\n", reply->str);
freeReplyObject(reply);
redisFree(redis);
system("pause");
```
*如果有什么疑問,可以留言與我溝通~~~~*
* * *
如果遇到與庫沖突的問題,可以在右擊項目->屬性->配置屬性->連接器->命令行中輸入/NODEFAULTLIB:libcmt.lib
如果遇到 error C4996,各種unsafe報錯啊,請右擊項目->屬性->配置屬性->C/C++->預處理器->預處理器定義->添加“\_CRT\_SECURE\_NO\_WARNINGS”(不帶引號)
*來源:[https://www.cnblogs.com/raker/p/4368741.html](https://www.cnblogs.com/raker/p/4368741.html)*
- 啥叫DynamicalBilliards動態粒子(動力臺球)
- 五大系統-為啥搞那么復雜?
- 內存數據庫triangleBilliard19Redis參數190101
- HiRedis在C++Windows下配置編譯使用190101
- 三大視圖:inputOrigin_計算系統(無理數非視圖)_3輸出視圖190110
- MGDs-Mp系統:數學生成數據(或數據生成)系統-參數修改模塊190102
- MGDs的安裝攻略190110
- redis+MGDs-Mp系統完整代碼之-代碼塊1-測試Redis連接190110
- c++中longdouble_longlong等能計算的最大、最小值190101
- 充分解耦的MGDs-充分松耦合的數學生成數據系統190111
- MGDs-數據生成系統的(部分)核心代碼190114
- mfc190115