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