2015-08-24 52 views
3

試圖在Windows上使用hiredis,構建一個正常的C++應用程序來讀取和寫入redis。問題在於,hiredis沒有正式支持在Windows上構建。如何構建一個利用hiredis與C++的應用程序?在Windows上使用hiredis進行開發

回答

6

經過大量搜索並嘗試使用CMake,我建議使用這種方法,儘管這些信息也可以用於與其他構建系統一起構建。

抓住Microsoft's open source redis project和開放的項目文件msvs\RedisServer.sln

建立在所需的配置項目(調試,發佈,...)

創建一個名爲hiredis_ROOT(控制面板 - >系統 - >高級系統環境變量設置 - >環境變量),並將其值設置爲提取的redis文件夾

創建一個cmake查找模塊,其內容如下,並放入項目根目錄cmake文件夾中,名稱爲Findhiredis.cmake

# set search hint directories 
set(
    hiredis_POSSIBLE_ROOT_PATHS 
    $ENV{hiredis_ROOT} 
    /usr/local 
    /usr 
) 


# find hiredis include directory 
# ================================================================================= 

find_path(
    hiredis_INCLUDE_DIR 
    NAME   hiredis/hiredis.h 
    HINTS   ${hiredis_POSSIBLE_ROOT_PATHS} 
    PATH_SUFFIXES "include" "deps" 
) 

if(NOT hiredis_INCLUDE_DIR) 
    message(STATUS "Checking for hiredis... no") 
    message(STATUS "Could not find include path for hiredis, try setting hiredis_ROOT") 
    return() 
endif() 


# find hiredis library 
# ================================================================================= 

# library for debug builds 
find_library(
    hiredis_LIBRARY_DEBUG 
    NAMES   hiredis 
    HINTS   ${hiredis_POSSIBLE_ROOT_PATHS} 
    PATH_SUFFIXES "msvs/x64/Debug" 
    DOC   "hiredis library for debug builds" 
) 

# library for release builds 
find_library(
    hiredis_LIBRARY_RELEASE 
    NAMES   hiredis 
    HINTS   ${hiredis_POSSIBLE_ROOT_PATHS} 
    PATH_SUFFIXES "msvs/x64/Release" 
    DOC   "hiredis library for release builds" 
) 

# create library name for linking 
set(hiredis_LIBRARY "") 
if(hiredis_LIBRARY_DEBUG AND hiredis_LIBRARY_RELEASE) 
    set(hiredis_LIBRARY "optimized;${hiredis_LIBRARY_RELEASE};debug;${hiredis_LIBRARY_DEBUG}") 
elseif(hiredis_LIBRARY_DEBUG) 
    set(hiredis_LIBRARY "${hiredis_LIBRARY_DEBUG}") 
elseif(hiredis_LIBRARY_RELEASE) 
    set(hiredis_LIBRARY "${hiredis_LIBRARY_RELEASE}") 
endif() 

# check the result 
if(NOT hiredis_LIBRARY) 
    message(STATUS "Checking for hiredis... no") 
    message(STATUS "hiredis include directory: ${hiredis_INCLUDE_DIR}") 
    message(STATUS "Could not find hiredis library") 
    return() 
endif() 


# find hiredis' interop library 
# ================================================================================= 

find_library(
    hiredis_interop_LIBRARY_DEBUG 
    NAMES   Win32_Interop 
    HINTS   ${hiredis_POSSIBLE_ROOT_PATHS} 
    PATH_SUFFIXES "msvs/x64/Debug" 
    DOC   "Windows modified interop library for debug builds" 
) 

find_library(
    hiredis_interop_LIBRARY_RELEASE 
    NAMES   Win32_Interop 
    HINTS   ${hiredis_POSSIBLE_ROOT_PATHS} 
    PATH_SUFFIXES "msvs/x64/Release" 
    DOC   "Windows modified interop library for release builds" 
) 

set(hiredis_interop_LIBRARY "") 
if(hiredis_interop_LIBRARY_DEBUG AND hiredis_interop_LIBRARY_RELEASE) 
    set(hiredis_interop_LIBRARY "optimized;${hiredis_interop_LIBRARY_RELEASE};debug;${hiredis_interop_LIBRARY_DEBUG}") 
elseif(hiredis_interop_LIBRARY_DEBUG) 
    set(hiredis_interop_LIBRARY "${hiredis_interop_LIBRARY_DEBUG}") 
elseif(hiredis_interop_LIBRARY_RELEASE) 
    set(hiredis_interop_LIBRARY "${hiredis_interop_LIBRARY_RELEASE}") 
endif() 

# check the result 
if(NOT hiredis_interop_LIBRARY) 
    message(STATUS "Checking for hiredis' interop... no") 
    message(STATUS "hiredis include directory: ${hiredis_INCLUDE_DIR}") 
    message(STATUS "Could not find hiredis interop library") 
    return() 
endif() 


# Sum up libraries 
# ================================================================================= 

set(Ws2_32_LIBRARY "optimized;Ws2_32;debug;Ws2_32") 
set(
    hiredis_LIBRARIES 

    ${hiredis_LIBRARY} 
    ${hiredis_interop_LIBRARY} 
    ${Ws2_32_LIBRARY} 
) 


# everything is found. just finish up 
# ================================================================================= 

set(hiredis_FOUND TRUE CACHE BOOL "Whether hiredis is found on the system or not") 
set(hiredis_INCLUDE_DIR ${hiredis_INCLUDE_DIR} CACHE PATH "hiredis include directory") 
set(hiredis_LIBRARIES ${hiredis_LIBRARIES} CACHE FILEPATH "hiredis library for linking against") 

message(STATUS "Checking for hiredis... yes") 

包括與此命令將在頂級CMakeLists.txt查找模塊:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") 
find_package(hiredis REQUIRED) 

設置的自定義,包括在cmake的項目路徑和鏈接庫:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_CRT_SECURE_NO_WARNINGS") 
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") 
include_directories(${hiredis_INCLUDE_DIR}) 
target_link_libraries(my-redis-application ${hiredis_LIBRARIES}) 

這就是它。你完成了。

+0

@CaptainObvlious做到了。我認爲在降價格式方面存在一個問題,那就是在編寫列表時不允許我插入代碼。必須刪除列表,但忘記插入代碼。 – Klaus

相關問題