• brpc 学习(一)M1 MacOS构建方法



    tags: brpc
    categories: brpc

    写在前面

    实习阶段初次接触到 RPC 这样一种协议, 以及 brpc 这样一个很棒的框架, 但是当时没时间认真深入学习, 就是围绕使用 demo 开发, 还是有点不知其所以然的, 最近抽空来学习一下 brpc, 首要的一点就是在开发机上构建项目, 并且能够跑起来, 下面来看看如何在 m1 芯片的 MacOS 上跑起来 brpc, 并且成功运行 demo 程序: echo 服务器

    环境:
    MacOS M1 arm64

    clang 14(xcode) cmake

    zsh

    源码下载

    $ git clone https://github.com/apache/brpc.git
    $ git branch -a
    $ git checkout -b release-1.6 remotes/origin/release-1.6
    $ git branch
      master
    * release-1.6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    依赖安装

    需要用到 brew, 关于 brew 的安装方法, 之前博客已经给出了, 这里主要说一下安装这些包时候所踩的坑.

    brpc/docs/cn/getting_started.md at master · apache/brpc;

    brew install openssl git gnu-getopt coreutils gflags protobuf@21 leveldb googletest gperftools
    brew link protobuf@21
    
    • 1
    • 2

    注意这里面的protobuf@21 非常重要, 因为 brpc 不支持 protobuf24(目前最新版), 只能用 21 来编译, 否则会出现很多错误!!!

    注意这里因为其他库例如 grpc 和gflags 等默认采用最新版 所以 protobuf 的最新版也会安装, 只需要对 protobuf@21强制执行 link即可, 就是带上--overwrite 选项, 可以用--dry-run 查看哪些文件需要被重写.

    针对gun-getopt 库, 如果提示未找到, 可以使用:

    echo 'export PATH="/opt/homebrew/opt/gnu-getopt/bin:$PATH"' >> ~/.zshrc
    source ~/.zshrc
    
    • 1
    • 2

    构建

    执行配置生成:

    sh config_brpc.sh --headers=/opt/homebrew/include --libs=/opt/homebrew/lib --cc=clang --cxx=clang++
    
    • 1

    这一步会生成一个config.mk 文件, 文件头部如下:

    # Generated by config_brpc.sh, don't modify manually
    SYSTEM=Darwin
    HDRS=/opt/homebrew/include/ /usr/local/opt/openssl/include/
    LIBS=/opt/homebrew/lib /usr/local/opt/openssl/lib/
    PROTOC=/opt/homebrew/bin/protoc
    PROTOBUF_HDR=/opt/homebrew/include/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此时需要改一下默认的 OpenSSL 位置, 否则报错:

    ssl ld error...
    # ssl 相关的库找不到了
    
    • 1
    • 2

    解决方案:

    /usr/local/opt/openssl -> /opt/homebrew/Cellar/openssl@3/3.1.2

    注意这里的版本, 需要先用brew info openssl 看一下版本.

    • 这里文档中提到可以用 ln -s 的方式创建软链接, 但是我这里创建之后还是不行, 就采用直接改配置的方式执行 了

    改完之后如下:

    # Generated by config_brpc.sh, don't modify manually
    SYSTEM=Darwin
    HDRS=/opt/homebrew/include/ /opt/homebrew/Cellar/openssl@3/3.1.2/include/
    LIBS=/opt/homebrew/lib /opt/homebrew/Cellar/openssl@3/3.1.2/lib/
    PROTOC=/opt/homebrew/bin/protoc
    PROTOBUF_HDR=/opt/homebrew/include/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最后就直接执行make -j8 , 耐心等待即可, 编译过程还是很快的, 我这两年多的 m1mba 还是很能打的.

    编译完成, 结果如下:

     ==> tree output -L 2
    output
    ├── bin
    │   └── protoc-gen-mcpack
    ├── include
    │   ├── brpc
    │   ├── bthread
    │   ├── butil
    │   ├── bvar
    │   ├── idl_options.pb.h
    │   ├── idl_options.proto
    │   ├── json2pb
    │   └── mcpack2pb
    └── lib
        ├── libbrpc.a
        └── libbrpc.dylib
    
    9 directories, 5 files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    然后来到 example 目录下的echo_c++ 中:

    make -j8
    
    • 1

    然后可以执行:

     ==> ./echo_server
    I0919 18:23:45   259 src/brpc/server.cpp:1127] Server[example::EchoServiceImpl] is serving on port=8000.
    I0919 18:23:45   259 src/brpc/server.cpp:1130] Check out http://xxx:8000 in web browser.
    I0919 18:23:48  2819 server.cpp:54] Received request[log_id=0] from 127.0.0.1:55478 to 127.0.0.1:8000: hello world (attached=)
    I0919 18:23:49  3075 server.cpp:54] Received request[log_id=1] from 127.0.0.1:55478 to 127.0.0.1:8000: hello world (attached=)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    以及:

     ==> ./echo_client
    I0919 18:23:48   259 client.cpp:78] Received response from 0.0.0.0:8000 to 127.0.0.1:55478: hello world (attached=) latency=1502us
    I0919 18:23:49   259 client.cpp:78] Received response from 0.0.0.0:8000 to 127.0.0.1:55478: hello world (attached=) latency=951us
    ^CI0919 18:23:49   259 client.cpp:89] EchoClient is going to quit
    
    • 1
    • 2
    • 3
    • 4

    完结撒花~

    补充: 通过 cmake 实现构建

    光用 make 确实可以构建了, 但是不能生成 command_flags.json, 用不了 clangd 啊…

    折腾一下 cmake 吧, 应该不是很复杂

    前置条件, 主要针对OpenSSL 这个库, 需要改动的是 brpc 项目目录下的CMakeLists.txt文件, 搜索openssl, 找到这一行:

    if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
        set(OPENSSL_ROOT_DIR
            # "/usr/local/opt/openssl"    # Homebrew installed OpenSSL
            "/opt/homebrew/Cellar/openssl@3/3.1.2/" # add this line, specific version use `brew info openssl` to get
            )
    endif()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后还有一个很关键的点, 这里参考了:

    macos - cmake - osx/mac - openssl brew - Stack Overflow;

    cmake 的编译选项加上-DOPENSSL_ROOT_DIR=/opt/homebrew/Cellar/openssl@3/3.1.2 , 这样就可以了.

    $ mkdir build && cd build
    $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DOPENSSL_ROOT_DIR=/opt/homebrew/Cellar/openssl@3/3.1.2 ..
    $ make -j8
    
    • 1
    • 2
    • 3

    接着撒花~

  • 相关阅读:
    建模仿真分析软件:Wolfram SystemModeler mac
    线程安全问题 --- 死锁
    复现PNAS图表:数据整理+聚类离散热图
    若依框架:登录时如何解决404和验证码问题
    全面超越AutoGPT,面壁智能联合清华NLP实验室开源大模型「超级英雄」XAgent
    考研数据结构与算法(六)树与二叉树
    Windows下QT实现托盘程序及系统托盘刷新
    .NET合并程序集(多个dll/exe合并成一个dll)
    使用SSM为学校医务室开发一套管理系统
    37_ue4进阶末日生存游戏开发[显示物品列表]
  • 原文地址:https://blog.csdn.net/qq_41437512/article/details/133040423