gRPC Cpp 编译(备忘)

gRPC

github 地址: https://github.com/grpc/grpc

本文记录 gRPC Cpp 的编译过程

官方编译文档: https://github.com/grpc/grpc/blob/master/BUILDING.md

CMake

这里是 CMake 编译

要求 CMake 版本: >= 3.13

一般 CentOS 系统可能需要升级 CMake

以下命令:

wget https://cmake.org/files/v3.20/cmake-3.20.1.zip
unzip cmake-3.20.1.zip
cd cmake-3.20.1
./bootstrap
gmake
[sudo] gmake install
/usr/local/bin/cmake --version
yum remove cmake -y
ln -s /usr/local/bin/cmake /usr/bin/
cmake --version

编译 gRPC Cpp

一般以下命令:

git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init
mkdir -p cmake/build
cd cmake/build
cmake -DCMAKE_BUILD_TYPE=Release ../..
make
find third_party -name "*.a" | xargs -i cp {} .
find third_party -name "libabsl_*.a" | xargs ar crsT libabsl.a
find . -name "address_sorting*.o" | xargs ar crsv libaddress_sorting.a

注意事项

  • 编译 gRPC Cpp 时,一定要添加DCMAKE_BUILD_TYPE=Release 。不然不是 Realse 版,性能上不去
  • 注意 3 个 find 语句,都是方便抓取 gRPC 依赖的第 3 方库文件
  • 如果这里的 libabsl.a 合并出来的不能用,见最后章节脚本

常见编译脚本

用 CMakeLists.txt 的话,一般这样:

cmake_minimum_required (VERSION 3.13)
set(CMAKE_CXX_STANDARD 11)
project (grpc_test)
add_definitions(-g)
add_compile_options(-O3)
include_directories(".")
include_directories("/home/fananchong/grpc/include")
include_directories("/home/fananchong/grpc/third_party/abseil-cpp/")
link_directories(/home/fananchong/grpc/cmake/build)
FILE(GLOB SRC_FILES TestAsyncServer.cpp helloworld.grpc.pb.cc helloworld.pb.cc)
add_executable(TestAsyncServer ${SRC_FILES})
target_link_libraries(TestAsyncServer -Wl,--start-group grpc++_reflection grpc++ grpc gpr upb cares crypto protobuf ssl z re2 absl address_sorting pthread -Wl,--end-group)

自动编译脚本

最后附上自动编译脚本:

#!/bin/bash

set -ex

# yum groupinstall -y "Development Tools" "Development Libraries"

# CMake
n=$(cmake --version | grep "3.20.1" | wc -l)
if [ "$n" == "0" ]; then
    mkdir -p /tmp/cmake
    pushd /tmp/cmake
    if [ ! -f "cmake-3.20.1.zip" ]; then
        wget https://cmake.org/files/v3.20/cmake-3.20.1.zip
        unzip cmake-3.20.1.zip
    fi
    cd cmake-3.20.1
    ./bootstrap --parallel=8
    gmake -j 8
    gmake install
    /usr/local/bin/cmake --version
    yum remove cmake -y
    ln -sf /usr/local/bin/cmake /usr/bin/
    cmake --version
    popd
fi

# gRPC CPP
function cp_ex() {
    src_dir=$1
    dst_dir=$2
    echo $src_dir
    echo $dst_dir
    pushd $1
    files=$(find absl/ -name "*.h")
    for file in ${files[@]}; do
        path=${file%/*}
        mkdir -p $2/$path
        cp -f $1/$file $2/$file
    done
    popd
}
if [ ! -d ../dep/grpc ]; then
    if [ ! -d /tmp/grpc ]; then
        mkdir -p /tmp/
        pushd /tmp/
        git clone -b v1.38.0 https://github.com/grpc/grpc.git
        cd grpc
        git submodule update --init
        mkdir -p cmake/build
        cd cmake/build
        cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS="-fPIC" ../..
        make -j 8
        find third_party -name "*.a" | xargs -i cp {} .
        mkdir -p tmpo
        cp libabsl_*.a tmpo/
        cd tmpo
        find . -name "libabsl_*.a" | xargs -i ar x  {}
        ar crsv libabsl.a *.o
        cd ..
        cp -f tmpo/libabsl.a .
        find . -name "address_sorting*.o" | xargs ar crsv libaddress_sorting.a
        popd
    fi
    mkdir -p ../dep/grpc/lib
    mkdir -p ../dep/grpc/include
    cp -f /tmp/grpc/cmake/build/*.a ../dep/grpc/lib/
    cp -rf /tmp/grpc/include/* ../dep/grpc/include/
    mkdir -p ../dep/absl/lib
    mkdir -p ../dep/absl/include
    tempdir=$PWD/../dep/absl/include
    cp_ex /tmp/grpc/third_party/abseil-cpp/ $tempdir
    mv ../dep/grpc/lib/libabsl*.a ../dep/absl/lib/
    cp -f /tmp/grpc/cmake/build/grpc_*_plugin /usr/local/bin/
    cp -f /tmp/grpc/cmake/build/third_party/protobuf/protoc /usr/local/bin/
    rm -rf /usr/bin/protoc
    ln -sf /usr/local/bin/protoc /usr/bin/
    protoc --version
fi
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值