cmake编译redis6.0源码总结

1配置clion使用cygwin模拟linux环境,先下载cygwin后配置

2导入源码,配置cmake文件

由于redis是基于Linux上的Makefile,所以Windows上需要配置CMakeLists.txt使用cmake工具编译运行。github上已经有人尝试编写CMakeLists.txt文件,项目地址为: https://github.com/LHRchina/redis。本文也是参考该项目的CMakeLists.txt文件,然后把缺少的库补上成功编译运行的。

redis根目录下配置CMakeLists.txt,文件内容如下:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# 项目编译配置来源https://www.cnblogs.com/youyoui/p/16028653.html
# bowen 项目报Dl_info相关错误,在Cygwin下的usr/include/dlfcn.h删除结构体
# 上的#if __GNU_VISIBLE和 #endif注释掉确保结构体Dl_info被编译,改动方式有多种这种修改原始的环境
project(redis VERSION 6.0)
#set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../src)
message(CMAKE_RUNTIME_OUTPUT_DIRECTORY is:${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
#if (NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type defined; defaulting to 'Debug'")
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING"The type of build. Possible values are: Debug, Release,
RelWithDebInfo and MinSizeRel.")#endif()
message(STATUS "Host is: ${CMAKE_HOST_SYSTEM}. Build target is:
${CMAKE_SYSTEM}")
get_filename_component(REDIS_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
message(STATUS "Project root directory is: ${REDIS_ROOT}")
# Just for debugging when handling a new platform.
if (false)message("C++ compiler supports these language features:")foreach (i ${CMAKE_CXX_COMPILE_FEATURES})message(" ${i}")endforeach ()
endif ()
message(STATUS "Generating release.h...")
#execute_process(
#        COMMAND sh -c ./src/mkreleasehdr.sh
#        WORKING_DIRECTORY ${REDIS_ROOT}/src/
#)
message("---begin--")
add_subdirectory(deps)
add_subdirectory(src/modules)
message("---begin")
set(SRC_SERVER_TMPsrc/crcspeed.csrc/crcspeed.hsrc/sha256.csrc/sha256.hsrc/connection.csrc/connection.hsrc/acl.csrc/timeout.csrc/tracking.csrc/tls.csrc/adlist.csrc/ae.csrc/anet.c# windows屏蔽掉下面两个文件,mac系统不需要屏蔽,这两个是mac环境多路复用的库# /usr/local/include/event.h# src/ae_kqueue.csrc/mt19937-64.csrc/mt19937-64.hsrc/monotonic.csrc/monotonic.hsrc/dict.csrc/sds.csrc/zmalloc.csrc/lzf_c.csrc/lzf_d.csrc/pqsort.csrc/zipmap.csrc/sha1.csrc/ziplist.csrc/release.csrc/networking.csrc/util.csrc/object.csrc/db.csrc/replication.csrc/rdb.csrc/t_string.csrc/t_list.csrc/t_set.csrc/t_zset.csrc/evict.csrc/defrag.csrc/module.csrc/quicklist.csrc/expire.csrc/childinfo.csrc/redis-check-aof.csrc/redis-check-rdb.csrc/lazyfree.csrc/geohash.csrc/rax.csrc/geohash_helper.csrc/siphash.csrc/geo.csrc/t_hash.csrc/config.csrc/aof.csrc/pubsub.csrc/multi.csrc/debug.csrc/sort.csrc/intset.csrc/syncio.csrc/cluster.csrc/crc16.csrc/endianconv.csrc/slowlog.csrc/scripting.csrc/bio.csrc/rio.csrc/rand.csrc/memtest.csrc/crc64.csrc/bitops.csrc/sentinel.csrc/notify.csrc/setproctitle.csrc/blocked.csrc/hyperloglog.csrc/latency.csrc/sparkline.csrc/t_stream.csrc/lolwut.csrc/lolwut.hsrc/lolwut5.csrc/lolwut6.csrc/listpack.csrc/localtime.csrc/gopher.c
)
set(SRC_SERVER src/server.c ${SRC_SERVER_TMP})
set(SRC_CLIsrc/cli_common.csrc/mt19937-64.csrc/monotonic.csrc/crcspeed.c# ---src/anet.csrc/sds.csrc/adlist.csrc/redis-cli.csrc/zmalloc.csrc/release.csrc/ae.csrc/crc64.csrc/crc16.csrc/dict.csrc/siphash.c
)
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")# better not to work with jemalloc
endif ()
set(EXECUTABLE_OUTPUT_PATH src)
add_executable(redis-server ${SRC_SERVER})
add_executable(redis-cli ${SRC_CLI})
set_property(TARGET redis-server PROPERTY C_STANDARD 99)
set_property(TARGET redis-server PROPERTY CXX_STANDARD 11)
set_property(TARGET redis-server PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET redis-cli PROPERTY C_STANDARD 99)
set_property(TARGET redis-cli PROPERTY CXX_STANDARD 11)
set_property(TARGET redis-cli PROPERTY CXX_STANDARD_REQUIRED ON)
target_include_directories(redis-serverPRIVATE ${REDIS_ROOT}/deps/hiredisPRIVATE ${REDIS_ROOT}/deps/linenoisePRIVATE ${REDIS_ROOT}/deps/lua/src
)target_link_libraries(redis-serverPRIVATE pthreadPRIVATE mPRIVATE luaPRIVATE linenoisePRIVATE hiredis${CMAKE_DL_LIBS}
)target_include_directories(redis-cliPRIVATE ${REDIS_ROOT}/deps/hiredisPRIVATE ${REDIS_ROOT}/deps/linenoisePRIVATE ${REDIS_ROOT}/deps/lua/src
)target_link_libraries(redis-cliPRIVATE pthreadPRIVATE mPRIVATE linenoisePRIVATE hiredis
)
link_directories(deps/hiredis/ deps/linenoise/ diredeps/lua/src)
install(TARGETS redis-serverRUNTIME DESTINATION bin
)
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -c")

src/modules目录下配置CMakeLists.txt,文件内容如下:

cmake_minimum_required(VERSION 3.0)
set(CMAKE_BUILD_TYPE "Debug")add_library(helloworld SHARED helloworld.c)
set_target_properties(helloworld PROPERTIES PREFIX "" SUFFIX ".so")add_library(hellotype SHARED hellotype.c)
set_target_properties(hellotype PROPERTIES PREFIX "" SUFFIX ".so")add_library(helloblock SHARED helloblock.c)
set_target_properties(helloblock PROPERTIES PREFIX "" SUFFIX ".so")#add_library(testmodule SHARED testmodule.c)
#set_target_properties(testmodule PROPERTIES PREFIX "" SUFFIX ".so")

deps目录下配置CMakeLists.txt,文件内容如下:

add_subdirectory(hiredis)
add_subdirectory(linenoise)
add_subdirectory(lua)

deps/hiredis目录下配置CMakeLists.txt,文件内容如下:

CMAKE_MINIMUM_REQUIRED(VERSION 3.4.0)
INCLUDE(GNUInstallDirs)
PROJECT(hiredis)OPTION(ENABLE_SSL "Build hiredis_ssl for SSL support" OFF)
OPTION(DISABLE_TESTS "If tests should be compiled or not" OFF)
OPTION(ENABLE_SSL_TESTS, "Should we test SSL connections" OFF)MACRO(getVersionBit name)SET(VERSION_REGEX "^#define ${name} (.+)$")FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/hiredis.h"VERSION_BIT REGEX ${VERSION_REGEX})STRING(REGEX REPLACE ${VERSION_REGEX} "\\1" ${name} "${VERSION_BIT}")
ENDMACRO(getVersionBit)getVersionBit(HIREDIS_MAJOR)
getVersionBit(HIREDIS_MINOR)
getVersionBit(HIREDIS_PATCH)
getVersionBit(HIREDIS_SONAME)
SET(VERSION "${HIREDIS_MAJOR}.${HIREDIS_MINOR}.${HIREDIS_PATCH}")
MESSAGE("Detected version: ${VERSION}")PROJECT(hiredis VERSION "${VERSION}")SET(ENABLE_EXAMPLES OFF CACHE BOOL "Enable building hiredis examples")SET(hiredis_sourcesalloc.casync.cdict.chiredis.cnet.cread.csds.csockcompat.c)SET(hiredis_sources ${hiredis_sources})IF(WIN32)ADD_COMPILE_DEFINITIONS(_CRT_SECURE_NO_WARNINGS WIN32_LEAN_AND_MEAN)
ENDIF()ADD_LIBRARY(hiredis SHARED ${hiredis_sources})SET_TARGET_PROPERTIES(hiredisPROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUEVERSION "${HIREDIS_SONAME}")
IF(WIN32 OR MINGW)TARGET_LINK_LIBRARIES(hiredis PRIVATE ws2_32)
ENDIF()TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC $<INSTALL_INTERFACE:.> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)CONFIGURE_FILE(hiredis.pc.in hiredis.pc @ONLY)INSTALL(TARGETS hiredisEXPORT hiredis-targetsRUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})INSTALL(FILES hiredis.h read.h sds.h async.h alloc.hDESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)INSTALL(DIRECTORY adaptersDESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis.pcDESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)export(EXPORT hiredis-targetsFILE "${CMAKE_CURRENT_BINARY_DIR}/hiredis-targets.cmake"NAMESPACE hiredis::)SET(CMAKE_CONF_INSTALL_DIR share/hiredis)
SET(INCLUDE_INSTALL_DIR include)
include(CMakePackageConfigHelpers)
configure_package_config_file(hiredis-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredis-config.cmakeINSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}PATH_VARS INCLUDE_INSTALL_DIR)INSTALL(EXPORT hiredis-targetsFILE hiredis-targets.cmakeNAMESPACE hiredis::DESTINATION ${CMAKE_CONF_INSTALL_DIR})INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis-config.cmakeDESTINATION ${CMAKE_CONF_INSTALL_DIR})IF(ENABLE_SSL)IF (NOT OPENSSL_ROOT_DIR)IF (APPLE)SET(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")ENDIF()ENDIF()FIND_PACKAGE(OpenSSL REQUIRED)SET(hiredis_ssl_sourcesssl.c)ADD_LIBRARY(hiredis_ssl SHARED${hiredis_ssl_sources})IF (APPLE)SET_PROPERTY(TARGET hiredis_ssl PROPERTY LINK_FLAGS "-Wl,-undefined -Wl,dynamic_lookup")ENDIF()SET_TARGET_PROPERTIES(hiredis_sslPROPERTIESWINDOWS_EXPORT_ALL_SYMBOLS TRUEVERSION "${HIREDIS_SONAME}")TARGET_INCLUDE_DIRECTORIES(hiredis_ssl PRIVATE "${OPENSSL_INCLUDE_DIR}")TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE ${OPENSSL_LIBRARIES})IF (WIN32 OR MINGW)TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE hiredis)ENDIF()CONFIGURE_FILE(hiredis_ssl.pc.in hiredis_ssl.pc @ONLY)INSTALL(TARGETS hiredis_sslEXPORT hiredis_ssl-targetsRUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})INSTALL(FILES hiredis_ssl.hDESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl.pcDESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)export(EXPORT hiredis_ssl-targetsFILE "${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-targets.cmake"NAMESPACE hiredis::)SET(CMAKE_CONF_INSTALL_DIR share/hiredis_ssl)configure_package_config_file(hiredis_ssl-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-config.cmakeINSTALL_DESTINATION ${CMAKE_CONF_INSTALL_DIR}PATH_VARS INCLUDE_INSTALL_DIR)INSTALL(EXPORT hiredis_ssl-targetsFILE hiredis_ssl-targets.cmakeNAMESPACE hiredis::DESTINATION ${CMAKE_CONF_INSTALL_DIR})INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl-config.cmakeDESTINATION ${CMAKE_CONF_INSTALL_DIR})
ENDIF()IF(NOT DISABLE_TESTS)ENABLE_TESTING()ADD_EXECUTABLE(hiredis-test test.c)IF(ENABLE_SSL_TESTS)ADD_DEFINITIONS(-DHIREDIS_TEST_SSL=1)TARGET_LINK_LIBRARIES(hiredis-test hiredis hiredis_ssl)ELSE()TARGET_LINK_LIBRARIES(hiredis-test hiredis)ENDIF()ADD_TEST(NAME hiredis-testCOMMAND ${CMAKE_CURRENT_SOURCE_DIR}/test.sh)
ENDIF()# Add examples
IF(ENABLE_EXAMPLES)ADD_SUBDIRECTORY(examples)
ENDIF(ENABLE_EXAMPLES)

deps/linenoise目录下配置CMakeLists.txt,文件内容如下:

add_library(linenoise linenoise.c)

deps/lua目录下配置CMakeLists.txt,文件内容如下:

set(LUA_SRCsrc/lauxlib.csrc/liolib.csrc/lopcodes.csrc/lstate.csrc/lobject.csrc/print.csrc/lmathlib.csrc/loadlib.csrc/lvm.csrc/lfunc.csrc/lstrlib.csrc/lua.csrc/linit.csrc/lstring.csrc/lundump.csrc/luac.csrc/ltable.csrc/ldump.csrc/loslib.csrc/lgc.csrc/lzio.csrc/ldblib.csrc/strbuf.csrc/lmem.csrc/lcode.csrc/ltablib.csrc/lua_struct.csrc/lapi.csrc/lbaselib.csrc/lua_cmsgpack.csrc/ldebug.csrc/lparser.csrc/lua_cjson.csrc/fpconv.csrc/lua_bit.csrc/llex.csrc/ltm.csrc/ldo.c)
add_library(lua STATIC ${LUA_SRC})

配置完之后,右键点击根目录下的CMakeLists.txt,选择Reload CMake Project。此时右上角会出现redis-server|Debug的运行选项,点击调试可以运行redis-server

问题:

    之前我编译成功了,但不久之后选择在linux环境编译这个项目,导致缓存一直存在报错问题。

如果当前重载项目没有可运行选项,在工具栏里选择清空缓存,重载cmake项目,不行的话退出Clion然后清除cmake缓存,删除编译目标文件再重载cmake。之前我编译成功后来不知道动了哪里的环境一直编译报错,后来发现是在此期间我更新了Clion导致的,clion做了优化之前运行redis-server服务时不会弹出cmd框,这导致在clion关闭运行后后面的服务还在运行现在是只要关闭cmd弹框就停止运行,效果更好。

报错问题汇总

如果使用的是其他版本的redis,则需要根据编译运行信息调整上面的CMakeLists.txt文件,相应的调整配置,一般是缺失编译文件或者多余代码。

编译报错error: unknown type name 'Dl_info'

首次编译的时候会遇到编译错误:

FAILED: CMakeFiles/redis-server.dir/src/debug.c.o 
/cygdrive/g/Projects/Git_Projects/redis-6.2.6/src/debug.c: In function 'dumpX86Calls':
/cygdrive/g/Projects/Git_Projects/redis-6.2.6/src/debug.c:1753:5: error: unknown type name 'Dl_info'

没有类型D1_info,因为这是一个调试文件,然后其中的函数没有调用,我的解决办法是把相关的函数注释掉。主要是src/debug.c文件中的dumpX86Calls函数和dumpCodeAroundEIP两个函数注释掉就可以了。

启动报错Address already in use

启动的时候报错端口被占用,redis-server默认使用6379端口,要去报该端口没有被占用才行,获取可以添加运行参数或者配置文件使用其他端口。

注意 编译源码最开始时有特殊的环境条件报错这个需要修改cygwin环境的内容,由于第一次编译很长时间忘记具体的内容,大概是环境检测上的当编译报错时可以网上收到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCF-Microbial Cell Factories

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 Microbial Cell Factories 是一份开放的同行评审期刊&#xff0c;涵盖了与微生物细胞作为重组蛋白和天然产物的生产者或作为工业兴趣的生物转化的催化剂的开发、使用和研究相关的任何主题…

【学习笔记】Windows GDI绘图(四)矩阵Matrix详解

矩阵Matrix 基于矩阵在GDI绘图的重要性&#xff0c;所以想深入了学习矩阵的相关属性与方法。 先上个本文中所有的函数图例演示吧。 原型&#xff1a; namespace System.Drawing.Drawing2D;public sealed unsafe class Matrix : MarshalByRefObject, IDisposableMatrix类封装…

系统架构师-考试-基础题-错题集锦2

108.总线-全双工、半双工&#xff1a; 109.软件配置管理-产品配置&#xff1a; 产品配置&#xff1a;指一个产品在其生命周期各个阶段所产生的各种形式和各种版本的文档、计算机程序、部件及数据的集合。 注意&#xff1a;选项中的需求规格说明、设计说明等均可归属于文档。 …

Netty学习02----使用多线程优化Selector

背景前置 在单线程环境下&#xff0c;使用一个线程同时绑定多个事件&#xff1a;连接事件、读事件、写事件。不能充分发挥多核CPU的优势&#xff0c;考虑使用多个线程&#xff0c;每个线程专门负责处理不同的事件&#xff0c;如下图所示&#xff1a;一个线程专门负责连接&#…

【ARK Survival Evolved】方舟:生存进化一键使用服务器开服联机教程

1、进入控制面板 2、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 3、设置游戏端口 方舟生存进化的设置需要三个端口&#xff0c;它们用于游戏端口&#xff08;必须为首选端口&#xff09;&#xff0c;查询端口&#…

uniapp中使用mockjs模拟接口测试总结(swiper轮播图示例)

完整总结下在uni-app中如何使用Mock.js模拟接口测试&#xff0c;这在后台接口未就绪的情况下非常有用。同时也给出个首页swiper轮播图的mock接口使用。网上的文章都不太完整&#xff0c;这里总结下完整的使用示例&#xff0c;同时也支持h5和小程序平台&#xff0c;分享给需要的…

webpack5 splitChunks分割代码

首先明确webpack 自身的打包行为 当splitChunks为false时&#xff0c;此时不启用任何打包设置 可以看到&#xff0c;静态引入全都打到一个chunk里&#xff0c;动态引入会拆分出来一个chunk,这是纯webpack无配置的打包&#xff0c; webpack会给每个模块打上标记 ,如下 { m…

Python使用multiprocessing实现多进程

大家好&#xff0c;当我们工作中涉及到处理大量数据、并行计算或并发任务时&#xff0c;Python的multiprocessing模块是一个强大而实用的工具。通过它&#xff0c;我们可以轻松地利用多核处理器的优势&#xff0c;将任务分配给多个进程并同时执行&#xff0c;从而提高程序的性能…

基于transformers框架实践Bert系列3-单选题

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

【JavaEE】加法计算器与用户登录实战演练

目录 综合练习加法计算器1. 准备工作2. 约定前后端交互接口3. 服务器代码 用户登录1. 准备工作2. 约定前后端交互接口3. 服务器代码4. 调整前端页面代码 综合练习 理解前后端交互过程接⼝传参, 数据返回, 以及⻚⾯展⽰ 加法计算器 需求: 输⼊两个整数, 点击"点击相加&q…

56. UE5 RPG 给敌人添加AI实现跟随玩家

在这一篇里&#xff0c;我们要实现一下敌人的AI&#xff0c;敌人也需要一系列的行为&#xff0c;比如朝向英雄攻击&#xff0c;移动&#xff0c;在满足条件时施放技能。这些敌人的行为可以通过使用UE的内置的AI系统去实现。 在UE里&#xff0c;只要是基于Character类创建的蓝图…

安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)

大家都知道&#xff0c;安卓每次更新都会给权限划分的更细、收的更紧。   早在安卓11的时候还可以直接通过授权Android/data来实现操作其他软件的目录&#xff0c;没有之前安卓11授权的图了&#xff0c;反正都长一个样&#xff0c;就直接贴新图了。   后面到了安卓12~13的…

信息系统项目管理师0128:输出(8项目整合管理—8.6管理项目知识—8.6.3输出)

点击查看专栏目录 文章目录 8.6.3 输出 8.6.3 输出 经验教训登记册 经验教训登记册可以包含执行情况的类别和详细的描述&#xff0c;还可包括与执行情况相关的影响、建议和行动方案。经验教训登记册可以记录遇到的挑战、问题、意识到的风险和机会以及其他适用的内容。经验教训…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB&#xff0c;各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来&#xff0c;以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

npm介绍、常用命令详解以及什么是全局目录

目录 npm介绍、常用命令详解以及什么是全局目录一、介绍npm的主要功能npm仓库npm的配置npm的版本控制 二、命令1. npm init: 初始化一个新的Node.js项目&#xff0c;创建package.json文件。package.json是一个描述项目信息和依赖关系的文件。2. npm install <package_name&g…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

基于vue3速学angular

因为工作原因&#xff0c;需要接手新的项目&#xff0c;新的项目是angular框架的&#xff0c;自学下和vue3的区别&#xff0c;写篇博客记录下&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/546843290?utm_id0 1.结构上&#xff1a; vue3:一个vue文件&#xff…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

​​​【收录 Hello 算法】10.1 二分查找

目录 10.1 二分查找 10.1.1 区间表示方法 10.1.2 优点与局限性 10.1 二分查找 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空…

​​​【收录 Hello 算法】第 10 章 搜索

目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险&#xff0c;我们或许需要走遍神秘空间的每个角落&#xff0c;又或许可以快速锁定目标。 在这场寻觅之旅中&#xff0c;每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…