在Windows上使用hiredis进行开发

Kla*_*aus 3 c++ windows redis hiredis

尝试在Windows 上使用hiredis,构建一个正常的c ++应用程序来读取和写入redis.问题是hiredis没有正式支持在Windows上构建.如何用c ++构建一个利用hiredis的应用程序?

Kla*_*aus 7

经过大量的搜索和尝试后,我使用CMake提出了这个方法,尽管这些信息也可用于与其他构建系统一起构建.

抓住微软的开源redis项目并打开项目文件msvs\RedisServer.sln

以所需的配置构建项目(调试,发布,...)

创建一个名为hiredis_ROOT(控制面板 - >系统 - >高级系统设置 - >环境变量)的环境变量,并将其值设置为提取的redis文件夹

使用下面的内容创建一个cmake find模块,并将其放在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")
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt使用此命令在顶级包含find模块:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
find_package(hiredis REQUIRED)
Run Code Online (Sandbox Code Playgroud)

在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})
Run Code Online (Sandbox Code Playgroud)

而已.而且你已经完成了.