windows下C++編譯配置hiredis的方法(VS2017)
前言
最近在學習redis的使用,以及在windows下通過C++連線redis伺服器進行操作。在參考了幾篇部落格,又自己處理許多編譯錯誤的問題,終於將hiredis客戶端配置成功了,特此記錄,方便檢視。
開始
環境說明
在這塊需要說明的是,我使用的是3.2.100版本的hiredis客戶端,對於其他版本的,沒有嘗試,不過感覺大致思路應該是一致的
開始配置
這裡主要講述從redis的編譯安裝到使用hiredis進行C++程式的過程,如果只需要hiredis的配置使用,可略過redis的編譯部分
Redis編譯安裝
以下是Redis的編譯安裝,如果感覺麻煩的話,可以直接下載redis的windows安裝包進行安裝:地址:
Redis-x64-3.2.100.msi
如果上述地址無法下載可以選擇這個:Redis-x64-3.2.100.msi
解壓下載下來的
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:檢查匯出工具
在命令列介面找到redis的目錄,執行redis-server.exe開啟服務。redis-cli.exe連線服務。詳細命令可以檢視redis命令中心
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;
}
如果有什麼疑問,可以留言與我溝通~~~~
如果遇到與庫衝突的問題,可以在右擊專案->屬性->配置屬性->聯結器->命令列中輸入/NODEFAULTLIB:libcmt.lib
如果遇到 error C4996,各種unsafe報錯啊,請右擊專案->屬性->配置屬性->C/C++->前處理器->前處理器定義->新增“_CRT_SECURE_NO_WARNINGS”(不帶引號)