在Windows上与招聘人员一起开发
Develop with hiredis on Windows
尝试在Windows上使用hiredis,构建一个普通的c++应用程序来读写redis。问题是,hiredis并不正式支持在Windows上构建。如何使用c++构建一个应用程序?
经过大量的搜索和尝试,我使用CMake提出了这种方法,尽管这些信息也可以用于与其他构建系统一起构建。
抓取微软的开源redis项目并打开项目文件msvsRedisServer.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
中包含find模块:
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})
就是这样。
我可以提供一个替代的cpp库bredis:它不使用官方的redis解析器(hiredis
库),这就是为什么它可以完美地在Windows (c++ 14)上编译。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 将 std::allocate_shared 与多态资源分配器一起使用
- 我正在开发服务器,ip作为参数传递不起作用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 在Windows上与招聘人员一起开发