1. 程式人生 > >windows下C++編譯配置hiredis的方法(VS2017)

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.libWin32_Interop.lib即可。

  • \redis-win-3.2.100\msvs\x64\Debug目錄中可以看到兩個靜態連結庫檔案:hiredis.libWin32_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.libWin32_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”(不帶引號)