mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

在這里插入圖片描述

問題背景與挑戰

在構建高性能RPC框架BRPC時,?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點:

  • ?路徑搜索不精確?:默認find_library無法定位自定義安裝路徑下的Protobuf
  • ?版本兼容性問題?:Protobuf新舊版本接口差異導致編譯失敗
  • ?跨平臺兼容性差?:macOS與Linux路徑差異未充分考慮

關鍵優化點解析

1. 提升CMake版本要求

cmake_minimum_required(VERSION 3.5)  # 原為2.8.12
  • ?解決兼容性問題?:確保使用現代CMake特性4
  • ?支持新標準?:為C++17特性提供基礎保障

2. 顯式Protobuf路徑配置

set(Protobuf_PREFIX_PATH"/usr/local/protobuf/include""/usr/local/protobuf/lib""/usr/local/protobuf/bin"
)
list(APPEND CMAKE_PREFIX_PATH "${Protobuf_PREFIX_PATH}")
  • ?精準定位依賴?:消除系統多版本沖突風險
  • ?跨平臺支持?:適配自定義安裝路徑場景2

3. 強化Protobuf查找機制

find_package(Protobuf REQUIRED PATH /usr/local/protobuf)
set(PROTOBUF_PATH /usr/local/protobuf)# 設置頭文件和庫路徑
include_directories(${PROTOBUF_PATH}/include)
link_directories(${PROTOBUF_PATH}/lib)# 確保protoc可執行文件被找到
find_program(Protobuf_PROTOC_EXECUTABLE NAMES protoc PATHS "/usr/local/protobuf/bin" REQUIRED)
message("Protobuf_PROTOC_EXECUTABLE: ${Protobuf_PROTOC_EXECUTABLE}")
  • ?三重保障機制?:
    1. find_package指定搜索路徑
    2. 手動設置include/link目錄
    3. 顯式定位protoc可執行文件1

4. 庫文件查找優化

find_library(PROTOC_LIB NAMES protoc PATHS "${PROTOBUF_PATH}/lib")
  • ?解決核心報錯?:針對性修復Fail to find protoc lib錯誤
  • ?路徑精確指定?:避免搜索系統默認路徑導致的版本混淆

構建驗證與測試

優化后通過以下命令驗證:

# 清理歷史構建
rm -rf build && mkdir build && cd build# 配置與構建
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)# 驗證關鍵文件
ls /usr/local/include/brpc/*.h
ls /usr/local/lib/libbrpc*

測試建議使用官方示例:

cd example/echo_c++
make && ./echo_server  # 另起終端運行./echo_client

預期輸出:Received: Hello BRPC!2,4

常見問題解決方案

1. 運行時libbrpc.so未找到

# 臨時方案
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH# 永久方案
echo "export LD_LIBRARY_PATH=/usr/local/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc

2. 頭文件缺失錯誤

sudo make install  # 重新安裝
sudo ldconfig     # 更新庫緩存

3. 協議不匹配問題

// 確保服務端/客戶端協議一致
brpc::ChannelOptions options;
options.protocol = brpc::PROTOCOL_BAIDU_STD;  // 默認協議

最佳實踐建議

  1. ?版本凍結?:在項目中固定Protobuf和BRPC版本
  2. ?隔離環境?:使用Docker或conda管理構建環境
  3. ?持續集成?:在CI流程中加入構建驗證步驟
  4. ?文檔記錄?:維護項目專用的構建文檔5

?經驗總結?:通過精準控制依賴路徑,我們成功解決了Fail to find protoc lib等典型構建錯誤。關鍵思路是顯式優于隱式——直接指定路徑而非依賴系統自動查找3。

修改后的CMakeLists.txt

mac上完整修改后的CMakeLists.txt如下:

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.cmake_minimum_required(VERSION 3.5)
project(brpc C CXX)option(WITH_GLOG "With glog" OFF)
option(WITH_MESALINK "With MesaLink" OFF)
option(WITH_BORINGSSL "With BoringSSL" OFF)
option(DEBUG "Print debug logs" OFF)
option(WITH_DEBUG_SYMBOLS "With debug symbols" ON)
option(WITH_THRIFT "With thrift framed protocol supported" OFF)
option(WITH_BTHREAD_TRACER "With bthread tracer supported" OFF)
option(WITH_SNAPPY "With snappy" OFF)
option(WITH_RDMA "With RDMA" OFF)
option(WITH_DEBUG_BTHREAD_SCHE_SAFETY "With debugging bthread sche safety" OFF)
option(WITH_DEBUG_LOCK "With debugging lock" OFF)
option(WITH_ASAN "With AddressSanitizer" OFF)
option(BUILD_UNIT_TESTS "Whether to build unit tests" OFF)
option(BUILD_FUZZ_TESTS "Whether to build fuzz tests" OFF)
option(BUILD_BRPC_TOOLS "Whether to build brpc tools" ON)
option(DOWNLOAD_GTEST "Download and build a fresh copy of googletest. Requires Internet access." ON)# Enable MACOSX_RPATH. Run "cmake --help-policy CMP0042" for policy details.
if(POLICY CMP0042)cmake_policy(SET CMP0042 NEW)
endif()set(BRPC_VERSION 1.13.0)SET(CPACK_GENERATOR "DEB")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "brpc authors")
INCLUDE(CPack)if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")# require at least gcc 4.8if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)message(FATAL_ERROR "GCC is too old, please install a newer version supporting C++11")endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")# require at least clang 3.3if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3)message(FATAL_ERROR "Clang is too old, please install a newer version supporting C++11")endif()
else()message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.")
endif()set(WITH_GLOG_VAL "0")
if(WITH_GLOG)set(WITH_GLOG_VAL "1")set(BRPC_WITH_GLOG 1)
endif()if(WITH_DEBUG_SYMBOLS)set(DEBUG_SYMBOL "-g")
endif()set(WITH_DEBUG_LOCK_VAL "0")
if(WITH_DEBUG_LOCK)set(WITH_DEBUG_LOCK_VAL "1")
endif()if(WITH_THRIFT)set(THRIFT_CPP_FLAG "-DENABLE_THRIFT_FRAMED_PROTOCOL")find_library(THRIFT_LIB NAMES thrift)if (NOT THRIFT_LIB)message(FATAL_ERROR "Fail to find Thrift")endif()
endif()if (WITH_BTHREAD_TRACER)if (NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux")  OR NOT (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64"))message(FATAL_ERROR "bthread tracer is only supported on Linux x86_64 platform")endif()find_path(LIBUNWIND_INCLUDE_PATH NAMES libunwind.h)find_library(LIBUNWIND_LIB NAMES unwind)find_library(LIBUNWIND_X86_64_LIB NAMES unwind-x86_64)if (NOT LIBUNWIND_INCLUDE_PATH OR NOT LIBUNWIND_LIB)message(FATAL_ERROR "Fail to find libunwind, which is needed by bthread tracer")endif()add_definitions(-DBRPC_BTHREAD_TRACER)include_directories(${LIBUNWIND_INCLUDE_PATH})
endif ()set(WITH_RDMA_VAL "0")
if(WITH_RDMA)set(WITH_RDMA_VAL "1")
endif()set(WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL "0")
if(WITH_DEBUG_BTHREAD_SCHE_SAFETY)set(WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL "1")
endif()include(GNUInstallDirs)configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_SOURCE_DIR}/src/butil/config.h @ONLY)list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")find_package(GFLAGS REQUIRED)include_directories(${PROJECT_SOURCE_DIR}/src${CMAKE_CURRENT_BINARY_DIR}
)execute_process(COMMAND bash -c "${PROJECT_SOURCE_DIR}/tools/get_brpc_revision.sh ${PROJECT_SOURCE_DIR} | tr -d '\n'"OUTPUT_VARIABLE BRPC_REVISION
)if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")include(CheckFunctionExists)CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)if(NOT HAVE_CLOCK_GETTIME)set(DEFINE_CLOCK_GETTIME "-DNO_CLOCK_GETTIME_IN_MAC")endif()set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -Wno-deprecated-declarations -Wno-inconsistent-missing-override")
endif()set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} ${DEFINE_CLOCK_GETTIME} -DBRPC_WITH_GLOG=${WITH_GLOG_VAL} -DBRPC_WITH_RDMA=${WITH_RDMA_VAL} -DBRPC_DEBUG_BTHREAD_SCHE_SAFETY=${WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL} -DBRPC_DEBUG_LOCK=${WITH_DEBUG_LOCK_VAL}")
if (WITH_ASAN)set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -fsanitize=address")set(CMAKE_C_FLAGS "${CMAKE_CPP_FLAGS} -fsanitize=address")
endif()
if(WITH_MESALINK)set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -DUSE_MESALINK")
endif()
set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -DBTHREAD_USE_FAST_PTHREAD_MUTEX -D__const__=__unused__ -D_GNU_SOURCE -DUSE_SYMBOLIZE -DNO_TCMALLOC -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -DBRPC_REVISION=\\\"${BRPC_REVISION}\\\" -D__STRICT_ANSI__")
set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} ${DEBUG_SYMBOL} ${THRIFT_CPP_FLAG}")
set(CMAKE_CXX_FLAGS "${CMAKE_CPP_FLAGS} -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-invalid-offsetof -Wno-unused-parameter -fno-omit-frame-pointer")
set(CMAKE_C_FLAGS "${CMAKE_CPP_FLAGS} -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-unused-parameter -fno-omit-frame-pointer")macro(use_cxx11)
if(CMAKE_VERSION VERSION_LESS "3.1.3")if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")endif()if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")endif()
else()set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
endmacro(use_cxx11)if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")#required by butil/crc32.cc to boost performance for 10xif((CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4))set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4 -msse4.2")elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64"))# segmentation fault in libcontextset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-gcse")endif()if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0))set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-aligned-new")endif()
endif()set(Protobuf_PREFIX_PATH"/usr/local/protobuf/include""/usr/local/protobuf/lib""/usr/local/protobuf/bin"
)list(APPEND CMAKE_PREFIX_PATH "${Protobuf_PREFIX_PATH}")
find_package(Protobuf REQUIRED PATH /usr/local/protobuf)
set(PROTOBUF_PATH /usr/local/protobuf)
# 設置Protobuf的頭文件和庫文件路徑
include_directories(${PROTOBUF_PATH}/include)
link_directories(${PROTOBUF_PATH}/lib)
link_directories(${PROTOBUF_PATH}/bin)set(Protobuf_PROTOC_EXECUTABLE "/usr/local/protobuf/bin/protoc")find_program(Protobuf_PROTOC_EXECUTABLE NAMES protoc PATHS "/usr/local/protobuf/bin" REQUIRED)message("Protobuf_PROTOC_EXECUTABLE: ${Protobuf_PROTOC_EXECUTABLE}")set(Protobuf_LIBRARIES ${PROTOBUF_PATH}/lib)
set(Protobuf_INCLUDE_DIR ${PROTOBUF_PATH}/include)if(Protobuf_VERSION GREATER 4.21)# required by abslset(CMAKE_CXX_STANDARD 17)find_package(absl REQUIRED CONFIG)set(protobuf_ABSL_USED_TARGETSabsl::absl_checkabsl::absl_logabsl::algorithmabsl::baseabsl::bind_frontabsl::bitsabsl::btreeabsl::cleanupabsl::cordabsl::core_headersabsl::debuggingabsl::die_if_nullabsl::dynamic_annotationsabsl::flagsabsl::flat_hash_mapabsl::flat_hash_setabsl::function_refabsl::hashabsl::layoutabsl::log_initializeabsl::log_severityabsl::memoryabsl::node_hash_mapabsl::node_hash_setabsl::optionalabsl::spanabsl::statusabsl::statusorabsl::stringsabsl::synchronizationabsl::timeabsl::type_traitsabsl::utilityabsl::variant)
else()use_cxx11()
endif()
find_package(Threads REQUIRED)find_path(LEVELDB_INCLUDE_PATH NAMES leveldb/db.h)
find_library(LEVELDB_LIB NAMES leveldb)
if ((NOT LEVELDB_INCLUDE_PATH) OR (NOT LEVELDB_LIB))message(FATAL_ERROR "Fail to find leveldb")
endif()if(WITH_SNAPPY)find_path(SNAPPY_INCLUDE_PATH NAMES snappy.h)find_library(SNAPPY_LIB NAMES snappy)if ((NOT SNAPPY_INCLUDE_PATH) OR (NOT SNAPPY_LIB))message(FATAL_ERROR "Fail to find snappy")endif()include_directories(${SNAPPY_INCLUDE_PATH})
endif()if(WITH_GLOG)find_path(GLOG_INCLUDE_PATH NAMES glog/logging.h)find_library(GLOG_LIB NAMES glog)if((NOT GLOG_INCLUDE_PATH) OR (NOT GLOG_LIB))message(FATAL_ERROR "Fail to find glog")endif()include_directories(${GLOG_INCLUDE_PATH})
endif()if(WITH_MESALINK)find_path(MESALINK_INCLUDE_PATH NAMES mesalink/openssl/ssl.h)find_library(MESALINK_LIB NAMES mesalink)if((NOT MESALINK_INCLUDE_PATH) OR (NOT MESALINK_LIB))message(FATAL_ERROR "Fail to find MesaLink")else()message(STATUS "Found MesaLink: ${MESALINK_LIB}")endif()include_directories(${MESALINK_INCLUDE_PATH})
endif()if(WITH_RDMA)message("brpc compile with rdma")find_path(RDMA_INCLUDE_PATH NAMES infiniband/verbs.h)find_library(RDMA_LIB NAMES ibverbs)if((NOT RDMA_INCLUDE_PATH) OR (NOT RDMA_LIB))message(FATAL_ERROR "Fail to find ibverbs")endif()
endif()find_library(PROTOC_LIB NAMES protoc PATHS "${PROTOBUF_PATH}/lib" )if(NOT PROTOC_LIB)message(FATAL_ERROR "Fail to find protoc lib")
endif()if(WITH_BORINGSSL)find_package(BoringSSL)include_directories(${BORINGSSL_INCLUDE_DIR})
else()if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT OPENSSL_ROOT_DIR)set(OPENSSL_ROOT_DIR"/usr/local/opt/openssl" # Homebrew installed OpenSSL)endif()find_package(OpenSSL)include_directories(${OPENSSL_INCLUDE_DIR})
endif()include_directories(${GFLAGS_INCLUDE_PATH}${PROTOBUF_INCLUDE_DIRS}${LEVELDB_INCLUDE_PATH})set(DYNAMIC_LIB${GFLAGS_LIBRARY}${PROTOBUF_LIBRARIES} ${protobuf_ABSL_USED_TARGETS}${LEVELDB_LIB}${PROTOC_LIB}${CMAKE_THREAD_LIBS_INIT}${THRIFT_LIB}dlz)if(WITH_BORINGSSL)list(APPEND DYNAMIC_LIB ${BORINGSSL_SSL_LIBRARY})list(APPEND DYNAMIC_LIB ${BORINGSSL_CRYPTO_LIBRARY})
else()list(APPEND DYNAMIC_LIB ${OPENSSL_CRYPTO_LIBRARY})if(WITH_MESALINK)list(APPEND DYNAMIC_LIB ${MESALINK_LIB})else()list(APPEND DYNAMIC_LIB ${OPENSSL_SSL_LIBRARY})endif()
endif()if(WITH_RDMA)list(APPEND DYNAMIC_LIB ${RDMA_LIB})
endif()set(BRPC_PRIVATE_LIBS "-lgflags -lprotobuf -lleveldb -lprotoc -lssl -lcrypto -ldl -lz")if(WITH_GLOG)set(DYNAMIC_LIB ${GLOG_LIB} ${DYNAMIC_LIB})set(BRPC_PRIVATE_LIBS "-lglog ${BRPC_PRIVATE_LIBS}")
endif()if(WITH_SNAPPY)set(DYNAMIC_LIB ${DYNAMIC_LIB} ${SNAPPY_LIB})set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lsnappy")
endif()if (WITH_BTHREAD_TRACER)set(DYNAMIC_LIB ${DYNAMIC_LIB} ${LIBUNWIND_LIB} ${LIBUNWIND_X86_64_LIB})set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lunwind -lunwind-x86_64")
endif()if(CMAKE_SYSTEM_NAME STREQUAL "Linux")set(DYNAMIC_LIB ${DYNAMIC_LIB} rt)set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lrt")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")set(DYNAMIC_LIB ${DYNAMIC_LIB}pthread"-framework CoreFoundation""-framework CoreGraphics""-framework CoreData""-framework CoreText""-framework Security""-framework Foundation""-Wl,-U,_MallocExtension_ReleaseFreeMemory""-Wl,-U,_ProfilerStart""-Wl,-U,_ProfilerStop""-Wl,-U,__Z13GetStackTracePPvii""-Wl,-U,_mallctl""-Wl,-U,_malloc_stats_print")
endif()# for *.so
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/output/lib)
# for *.a
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/output/lib)# the reason why not using file(GLOB_RECURSE...) is that we want to
# include different files on different platforms.
set(BUTIL_SOURCES${PROJECT_SOURCE_DIR}/src/butil/third_party/dmg_fp/g_fmt.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/dmg_fp/dtoa_wrapper.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/dynamic_annotations/dynamic_annotations.c${PROJECT_SOURCE_DIR}/src/butil/third_party/icu/icu_utf.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/superfasthash/superfasthash.c${PROJECT_SOURCE_DIR}/src/butil/third_party/modp_b64/modp_b64.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/symbolize/demangle.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/symbolize/symbolize.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy-sinksource.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy-stubs-internal.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy.cc${PROJECT_SOURCE_DIR}/src/butil/third_party/murmurhash3/murmurhash3.cpp${PROJECT_SOURCE_DIR}/src/butil/arena.cpp${PROJECT_SOURCE_DIR}/src/butil/at_exit.cc${PROJECT_SOURCE_DIR}/src/butil/atomicops_internals_x86_gcc.cc${PROJECT_SOURCE_DIR}/src/butil/base64.cc${PROJECT_SOURCE_DIR}/src/butil/base64url.cc${PROJECT_SOURCE_DIR}/src/butil/big_endian.cc${PROJECT_SOURCE_DIR}/src/butil/cpu.cc${PROJECT_SOURCE_DIR}/src/butil/debug/alias.cc${PROJECT_SOURCE_DIR}/src/butil/debug/asan_invalid_access.cc${PROJECT_SOURCE_DIR}/src/butil/debug/crash_logging.cc${PROJECT_SOURCE_DIR}/src/butil/debug/debugger.cc${PROJECT_SOURCE_DIR}/src/butil/debug/debugger_posix.cc${PROJECT_SOURCE_DIR}/src/butil/debug/dump_without_crashing.cc${PROJECT_SOURCE_DIR}/src/butil/debug/proc_maps_linux.cc${PROJECT_SOURCE_DIR}/src/butil/debug/stack_trace.cc${PROJECT_SOURCE_DIR}/src/butil/debug/stack_trace_posix.cc${PROJECT_SOURCE_DIR}/src/butil/environment.cc${PROJECT_SOURCE_DIR}/src/butil/files/file.cc${PROJECT_SOURCE_DIR}/src/butil/files/file_posix.cc${PROJECT_SOURCE_DIR}/src/butil/files/file_enumerator.cc${PROJECT_SOURCE_DIR}/src/butil/files/file_enumerator_posix.cc${PROJECT_SOURCE_DIR}/src/butil/files/file_path.cc${PROJECT_SOURCE_DIR}/src/butil/files/file_path_constants.cc${PROJECT_SOURCE_DIR}/src/butil/files/memory_mapped_file.cc${PROJECT_SOURCE_DIR}/src/butil/files/memory_mapped_file_posix.cc${PROJECT_SOURCE_DIR}/src/butil/files/scoped_file.cc${PROJECT_SOURCE_DIR}/src/butil/files/scoped_temp_dir.cc${PROJECT_SOURCE_DIR}/src/butil/file_util.cc${PROJECT_SOURCE_DIR}/src/butil/file_util_posix.cc${PROJECT_SOURCE_DIR}/src/butil/guid.cc${PROJECT_SOURCE_DIR}/src/butil/guid_posix.cc${PROJECT_SOURCE_DIR}/src/butil/hash.cc${PROJECT_SOURCE_DIR}/src/butil/lazy_instance.cc${PROJECT_SOURCE_DIR}/src/butil/location.cc${PROJECT_SOURCE_DIR}/src/butil/memory/aligned_memory.cc${PROJECT_SOURCE_DIR}/src/butil/memory/ref_counted.cc${PROJECT_SOURCE_DIR}/src/butil/memory/ref_counted_memory.cc${PROJECT_SOURCE_DIR}/src/butil/memory/singleton.cc${PROJECT_SOURCE_DIR}/src/butil/memory/weak_ptr.cc${PROJECT_SOURCE_DIR}/src/butil/posix/file_descriptor_shuffle.cc${PROJECT_SOURCE_DIR}/src/butil/posix/global_descriptors.cc${PROJECT_SOURCE_DIR}/src/butil/process_util.cc${PROJECT_SOURCE_DIR}/src/butil/rand_util.cc${PROJECT_SOURCE_DIR}/src/butil/rand_util_posix.cc${PROJECT_SOURCE_DIR}/src/butil/fast_rand.cpp${PROJECT_SOURCE_DIR}/src/butil/safe_strerror_posix.cc${PROJECT_SOURCE_DIR}/src/butil/sha1_portable.cc${PROJECT_SOURCE_DIR}/src/butil/strings/latin1_string_conversions.cc${PROJECT_SOURCE_DIR}/src/butil/strings/nullable_string16.cc${PROJECT_SOURCE_DIR}/src/butil/strings/safe_sprintf.cc${PROJECT_SOURCE_DIR}/src/butil/strings/string16.cc${PROJECT_SOURCE_DIR}/src/butil/strings/string_number_conversions.cc${PROJECT_SOURCE_DIR}/src/butil/strings/string_split.cc${PROJECT_SOURCE_DIR}/src/butil/strings/string_piece.cc${PROJECT_SOURCE_DIR}/src/butil/strings/string_util.cc${PROJECT_SOURCE_DIR}/src/butil/strings/string_util_constants.cc${PROJECT_SOURCE_DIR}/src/butil/strings/stringprintf.cc${PROJECT_SOURCE_DIR}/src/butil/strings/utf_offset_string_conversions.cc${PROJECT_SOURCE_DIR}/src/butil/strings/utf_string_conversion_utils.cc${PROJECT_SOURCE_DIR}/src/butil/strings/utf_string_conversions.cc${PROJECT_SOURCE_DIR}/src/butil/synchronization/cancellation_flag.cc${PROJECT_SOURCE_DIR}/src/butil/synchronization/condition_variable_posix.cc${PROJECT_SOURCE_DIR}/src/butil/synchronization/waitable_event_posix.cc${PROJECT_SOURCE_DIR}/src/butil/threading/non_thread_safe_impl.cc${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_posix.cc${PROJECT_SOURCE_DIR}/src/butil/threading/simple_thread.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_checker_impl.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_collision_warner.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_id_name_manager.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_posix.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_storage.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_storage_posix.cc${PROJECT_SOURCE_DIR}/src/butil/threading/thread_restrictions.cc${PROJECT_SOURCE_DIR}/src/butil/threading/watchdog.cc${PROJECT_SOURCE_DIR}/src/butil/time/clock.cc${PROJECT_SOURCE_DIR}/src/butil/time/default_clock.cc${PROJECT_SOURCE_DIR}/src/butil/time/default_tick_clock.cc${PROJECT_SOURCE_DIR}/src/butil/time/tick_clock.cc${PROJECT_SOURCE_DIR}/src/butil/time/time.cc${PROJECT_SOURCE_DIR}/src/butil/time/time_posix.cc${PROJECT_SOURCE_DIR}/src/butil/version.cc${PROJECT_SOURCE_DIR}/src/butil/logging.cc${PROJECT_SOURCE_DIR}/src/butil/class_name.cpp${PROJECT_SOURCE_DIR}/src/butil/errno.cpp${PROJECT_SOURCE_DIR}/src/butil/find_cstr.cpp${PROJECT_SOURCE_DIR}/src/butil/status.cpp${PROJECT_SOURCE_DIR}/src/butil/string_printf.cpp${PROJECT_SOURCE_DIR}/src/butil/thread_local.cpp${PROJECT_SOURCE_DIR}/src/butil/thread_key.cpp${PROJECT_SOURCE_DIR}/src/butil/unix_socket.cpp${PROJECT_SOURCE_DIR}/src/butil/endpoint.cpp${PROJECT_SOURCE_DIR}/src/butil/fd_utility.cpp${PROJECT_SOURCE_DIR}/src/butil/files/temp_file.cpp${PROJECT_SOURCE_DIR}/src/butil/files/file_watcher.cpp${PROJECT_SOURCE_DIR}/src/butil/time.cpp${PROJECT_SOURCE_DIR}/src/butil/zero_copy_stream_as_streambuf.cpp${PROJECT_SOURCE_DIR}/src/butil/crc32c.cc${PROJECT_SOURCE_DIR}/src/butil/containers/case_ignored_flat_map.cpp${PROJECT_SOURCE_DIR}/src/butil/iobuf.cpp${PROJECT_SOURCE_DIR}/src/butil/iobuf_profiler.cpp${PROJECT_SOURCE_DIR}/src/butil/binary_printer.cpp${PROJECT_SOURCE_DIR}/src/butil/recordio.cc${PROJECT_SOURCE_DIR}/src/butil/popen.cpp)if(CMAKE_SYSTEM_NAME STREQUAL "Linux")set(BUTIL_SOURCES ${BUTIL_SOURCES}${PROJECT_SOURCE_DIR}/src/butil/file_util_linux.cc${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_linux.cc${PROJECT_SOURCE_DIR}/src/butil/strings/sys_string_conversions_posix.cc)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")set(BUTIL_SOURCES ${BUTIL_SOURCES}${PROJECT_SOURCE_DIR}/src/butil/mac/bundle_locations.mm${PROJECT_SOURCE_DIR}/src/butil/mac/foundation_util.mm${PROJECT_SOURCE_DIR}/src/butil/file_util_mac.mm${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_mac.mm${PROJECT_SOURCE_DIR}/src/butil/strings/sys_string_conversions_mac.mm${PROJECT_SOURCE_DIR}/src/butil/time/time_mac.cc${PROJECT_SOURCE_DIR}/src/butil/mac/scoped_mach_port.cc)
endif()file(GLOB_RECURSE BVAR_SOURCES "${PROJECT_SOURCE_DIR}/src/bvar/*.cpp")
file(GLOB_RECURSE BTHREAD_SOURCES "${PROJECT_SOURCE_DIR}/src/bthread/*.cpp")
file(GLOB_RECURSE JSON2PB_SOURCES "${PROJECT_SOURCE_DIR}/src/json2pb/*.cpp")
file(GLOB_RECURSE BRPC_SOURCES "${PROJECT_SOURCE_DIR}/src/brpc/*.cpp")
file(GLOB_RECURSE THRIFT_SOURCES "${PROJECT_SOURCE_DIR}/src/brpc/thrift*.cpp")
file(GLOB_RECURSE EXCLUDE_SOURCES "${PROJECT_SOURCE_DIR}/src/brpc/event_dispatcher_*.cpp")if(WITH_THRIFT)message("brpc compile with thrift protocol")
else()# Remove thrift sourcesforeach(v ${THRIFT_SOURCES})list(REMOVE_ITEM BRPC_SOURCES ${v})endforeach()set(THRIFT_SOURCES "")
endif()foreach(v ${EXCLUDE_SOURCES})list(REMOVE_ITEM BRPC_SOURCES ${v})
endforeach()set(MCPACK2PB_SOURCES${PROJECT_SOURCE_DIR}/src/mcpack2pb/field_type.cpp${PROJECT_SOURCE_DIR}/src/mcpack2pb/mcpack2pb.cpp${PROJECT_SOURCE_DIR}/src/mcpack2pb/parser.cpp${PROJECT_SOURCE_DIR}/src/mcpack2pb/serializer.cpp)include(CompileProto)
set(PROTO_FILES idl_options.protobrpc/rtmp.protobrpc/rpc_dump.protobrpc/get_favicon.protobrpc/span.protobrpc/builtin_service.protobrpc/grpc_health_check.protobrpc/get_js.protobrpc/errno.protobrpc/nshead_meta.protobrpc/options.protobrpc/policy/baidu_rpc_meta.protobrpc/policy/hulu_pbrpc_meta.protobrpc/policy/public_pbrpc_meta.protobrpc/policy/sofa_pbrpc_meta.protobrpc/policy/mongo.protobrpc/trackme.protobrpc/streaming_rpc_meta.protobrpc/proto_base.proto)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/output/include/brpc)
set(PROTOC_FLAGS ${PROTOC_FLAGS} -I${PROTOBUF_INCLUDE_DIR})
compile_proto(PROTO_HDRS PROTO_SRCS ${PROJECT_BINARY_DIR}${PROJECT_BINARY_DIR}/output/include${PROJECT_SOURCE_DIR}/src"${PROTO_FILES}")
add_library(PROTO_LIB OBJECT ${PROTO_SRCS} ${PROTO_HDRS})set(SOURCES${BVAR_SOURCES}${BTHREAD_SOURCES}${JSON2PB_SOURCES}${MCPACK2PB_SOURCES}${BRPC_SOURCES}${THRIFT_SOURCES})add_subdirectory(src)
if(BUILD_UNIT_TESTS)enable_testing()add_subdirectory(test)
endif()if(BUILD_FUZZ_TESTS)if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")message(FATAL_ERROR "Fuzzing is only supported with clang")endif()if(NOT BUILD_UNIT_TESTS)message(FATAL_ERROR "BUILD_UNIT_TESTS must be enabled to build fuzz tests")endif()
endif()if(BUILD_BRPC_TOOLS)add_subdirectory(tools)
endif()file(COPY ${CMAKE_CURRENT_BINARY_DIR}/brpc/DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/output/include/brpc/FILES_MATCHINGPATTERN "*.h"PATTERN "*.hpp")
file(COPY ${PROJECT_SOURCE_DIR}/src/DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/output/include/FILES_MATCHINGPATTERN "*.h"PATTERN "*.hpp")
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/output/include/DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}FILES_MATCHINGPATTERN "*.h"PATTERN "*.hpp")# Install pkgconfig
configure_file(cmake/brpc.pc.in ${PROJECT_BINARY_DIR}/brpc.pc @ONLY)
install(FILES ${PROJECT_BINARY_DIR}/brpc.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

在這里插入圖片描述

Reference

brpc github

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88806.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中,性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏,還是 goroutine 失控,都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具,就像一把精準的手術刀,能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題,結合SSD特性和fio測試原理 fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案: &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院(IAAR-Shanghai)的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架,可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言:開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源,標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時,文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…

LeetCode 2401.最長優雅子數組

給你一個由 正 整數組成的數組 nums 。 如果 nums 的子數組中位于 不同 位置的每對元素按位 與(AND)運算的結果等于 0 ,則稱該子數組為 優雅 子數組。 返回 最長 的優雅子數組的長度。 子數組 是數組中的一個 連續 部分。 注意:長…

中華心法問答系統的解讀(1)

中華心法問答系統一、研究背景1. 研究意義2. 研究目的3. 信息檢索技術二、主要研究內容三、相關技術介紹1. Flask框架技術2. BERT模型(1)基本概念(2)BERT解決的問題(3)BERT的核心結構a. 模型結構b. 預訓練任…

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)引言:正文:一、Java 構建的全場景視頻處理系統(含校園 / 工廠 / 礦區適配)1.1 校園宿舍區夜間檢索方案(…

信號量機制,互斥的避免自旋鎖的實現方法(操作系統)

這次的比喻場景要升級了,因為它既能解決互斥問題,也能解決同步問題。我們用一個更綜合的場景:一個擁有多輛共享單車的站點。共享單車 (資源):站點里有多輛共享單車,數量是有限的。你 (進程):想借一輛車去辦…

零基礎 “入坑” Java--- 十、繼承

文章目錄一、何為繼承二、繼承語法三、父類成員訪問1.成員變量2.成員方法四、super關鍵字五、子類構造方法六、super和this辨析七、再談初始化八、protected關鍵字九、繼承方式十、final關鍵字十一、繼承與組合根據我們學過的類的知識,我們來定義兩個類:…

JS進階-day1 作用域解構箭頭函數

作用域全局作用域——>盡量少使用,避免變量污染局部作用域——>函數作用域、塊級作用域作用域鏈——>底層變量查找機制(先在當前函數作用域查找,如果找不到,就沿著作用域鏈向上級作用域查找,直到全局作用域&a…

Arduino 無線通信實戰:使用 RadioHead實現 315MHz 433M模塊數據傳輸

本文將介紹如何使用 Arduino 和 RadioHead 庫實現 315MHz(或 433MHz)ASK 無線通信。通過兩個 Arduino 控制板,一個作為發射端,一個作為接收端,實現“按鍵控制 → 無線發送 → LED 控制”的基礎通信功能,非常…

012_PDF處理與文檔分析

PDF處理與文檔分析 目錄 PDF支持概述支持的功能文檔限制上傳方式分析能力應用場景最佳實踐 PDF支持概述 核心能力 Claude現在可以直接處理PDF文檔,提供全面的文檔分析能力。這項功能支持: 文本內容分析:提取和理解PDF中的文本圖像識別&…

系規備考論文:論IT服務知識管理

論IT服務知識管理 摘要 2022年7月,我公司中標某市化工廠網絡視頻監控管理系統綜合平臺運維服務項目,并任命我為系統規劃與管理師。該項目組織結構為項目型,合同金額為115.5萬元(含稅),工期為1年。本運維服務項目的主要工作包括系統軟件和網絡設備的日常監控與維護,定期…

2025.7.12總結

最近又兩三天沒寫總結了,如今必須要寫一稿,畢竟事關賺錢認知的一次顛覆。在我原有的認知里,賺錢,就是通過出賣自己的勞動時間,精力,給他人提供價值輸出。但是,賺錢,只能通過出賣體力…

把 DNA 當 PCIe:一條 365 nt 鏈實現 64 Gbps 片上光互連——基于鏈式 F?rster 共振的分子級波分復用鏈路

作者 | Blossom.118 2025-07-13 關鍵詞:DNA 光子學、FRET 波分復用、分子 PCIe、零能耗光鏈路、CMOS 兼容、開源版圖 ---- 1. 為什么用 DNA 做光互連? ? 帶寬密度:硅光 1 m 波導最高 0.4 Tbps/mm;一條 2 nm 直徑的 DNA 雙鏈&am…

[論文閱讀]Text Compression for Efficient Language Generation

Text Compression for Efficient Language Generation [2503.11426] Text Compression for Efficient Language Generation NAACL 2025 提出了“Generative Pretrained Thoughtformer”(GPTHF),這是一個分層 transformer 語言模型&#xf…

SwiftUI 7 新 WebView:金蛇出洞,網頁江湖換新天

概述 崇禎年間,華山派武學雖盛,卻在應對江湖新局時漸顯頹勢;如今 SwiftUI 江湖亦是如此 ——WWDC 25 之前,若要在 SwiftUI 中顯示網頁,開發者恰似袁承志初闖江湖,縱有一身本領,卻苦無稱手兵刃。…

LeetCode|Day9|976. 三角形的最大周長|Python刷題筆記

LeetCode|Day9|976. 三角形的最大周長|Python刷題筆記 🗓? 本文屬于【LeetCode 簡單題百日計劃】系列 👉 點擊查看系列總目錄 >> 📌 題目簡介 題號:976. 三角形的最大周長 難度&#x…

華擎B150M Pro4S魔改bios上8代U

100、200系主板魔改bios在DIY領域當屬于歷史性事件,2018年左右興起。雖然現在已經是2025年,魔改bios已經沒有多大意義,但是跟著前輩的教程魔改一次,可以重溫下當年DIY玩家的激情。 魔改教程在SMXDIY網站,寫的非常詳細&…

音視頻學習(三十七):pts和dts

概念 PTS(Presentation Time Stamp)顯示時間戳 表示:該幀應該在什么時間被顯示/播放。主要用于:同步音頻與視頻,控制播放節奏。舉例:視頻幀 A 的 PTS 是 300ms,表示應在視頻播放第 300 毫秒時顯…