这篇文章介绍如何搭建tRPC-Cpp 框架的编译运行环境。
操作系统及版本:目前推荐操作系统为 Linux 内核,推荐Linux内核版本在2.6及以上。推荐使用 Linux 中 CentOS 及 Ubuntu 发行版本。另外暂不支持如 Windows、MacOS 等其他操作系统。
指令集:目前推荐在x86-64指令集及ARM指令集下运行,不推荐在其他指令集下运行。
GCC 版本:因为 tRPC-Cpp 使用了 C++17 标准特性,推荐使用GCC 7及以上版本。
tRPC-Cpp 框架源码依赖所需的第三方库(如:protobuf、gflags、fmtlib等),因此通常不需要额外安装依赖库。在搭建好编译环境之后,通常只需要拉取代码直接编译运行即可。
下面详细介绍如何在 CentOS 及 Ubuntu 编译运行 tRPC-Cpp 框架。
推荐CentOS版本在7.9及以上版本。
目前支持两种编译方式:bazel 或者 cmake。
bazel 推荐使用 3.5.1及以后版本。
-
bazel 安装(仅供参考,还有其他方式)
# bazel 安装依赖jdk,先安装jdk yum install java-11-openjdk yum install java-11-openjdk-devel # 安装bazel mkdir -p /root/env/bazel wget https://github.com/bazelbuild/bazel/releases/download/3.5.1/bazel-3.5.1-installer-linux-x86_64.sh -O /root/env/bazel/bazel.sh chmod +x /root/env/bazel/bazel.sh /root/env/bazel/bazel.sh > /dev/null rm -rf /root/env # 查看版本 bazel --version
-
example 编译并运行
仓库 clone 到本地之后,直接编译运行即可,具体如下:
# 进入根目录trpc-cpp cd trpc-cpp # 用bazel编译并运行框架提供的example示例 ./run_examples.sh
因为需要使用 cmake 的 FetchContent 特性来源码拉取第三方依赖,所以cmake推荐使用3.14及以后版本。
-
cmake 安装(仅供参考,还有其他方式)
yum install -y cmake3 ln -s /usr/bin/cmake3 /usr/bin/cmake # 查看版本 cmake -version
-
编译并运行examples
仓库clone到本地之后,直接编译运行即可,具体如下:
# 进入根目录trpc-cpp cd trpc-cpp # 用cmake编译并运行框架提供的examples ./run_examples_cmake.sh
-
如何引入tRPC-Cpp
a. (推荐)以外部库形式源码引入
推荐使用这种方式,因为能很方便切换框架的版本,同时,框架相关依赖可随构建的SDK目标引入。
参考如下示例,在您项目的 CMakeLists.txt 以外部库源码方式引入:
# 拉取并以库的形式添加tRPC-Cpp
include(FetchContent)
FetchContent_Declare(
trpc-cpp
GIT_REPOSITORY https://github.com/trpc-group/trpc-cpp.git
GIT_TAG recommanded_always_use_latest_tag
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake_third_party/trpc-cpp
)
FetchContent_MakeAvailable(trpc-cpp)
# 设置proto文件桩代码生成工具的路径(PROTOBUF_PROTOC_EXECUTABLE/TRPC_TO_CPP_PLUGIN将会在tRPC-Cpp被引入后自动填充)
set(PB_PROTOC ${PROTOBUF_PROTOC_EXECUTABLE})
set(TRPC_CPP_PLUGIN ${TRPC_TO_CPP_PLUGIN})
# 在您的构建目标里link trpc库
target_link_libraries(your_cmake_target trpc)
b. 通过make install引入
参考如下命令,先安装trpc到系统里:
# 可checkout切换到最新的版本
git clone https://github.com/trpc-group/trpc-cpp.git
cd trpc-cpp
mkdir build && cd build
# 默认编译静态库,可以通过cmake选项编译动态库: -DTRPC_BUILD_SHARED=ON
cmake ..
make -j8
make install
然后,参考如下步骤,在您项目的 CMakeLists.txt 里,引入trpc库:
# 设置tRPC-Cpp的安装位置
set(TRPC_INSTALL_PATH /usr/local/trpc-cpp/trpc)
# 加载tRPC-Cpp头文件及库路径
include(${TRPC_INSTALL_PATH}/cmake/config/trpc_config.cmake)
include_directories(${INCLUDE_INSTALL_PATHS})
link_directories(${LIBRARY_INSTALL_PATHS})
# 设置proto文件桩代码生成工具的路径 - 具体使用方式见相关章节
include(${TRPC_INSTALL_PATH}/cmake/tools/trpc_utils.cmake)
set(PB_PROTOC ${TRPC_INSTALL_PATH}/bin/protoc)
set(TRPC_CPP_PLUGIN ${TRPC_INSTALL_PATH}/bin/trpc_cpp_plugin)
# 添加trpc库及其依赖的三方
set(LIBRARY trpc ${LIBS_BASIC})
# 在您的构建目标里link trpc库
target_link_libraries(your_cmake_target trpc)
推荐Ubuntu 版本在 20.04 LTS 及以上版本。
下面介绍如何在 Ubuntu 编译运行 tRPC-Cpp 框架。
目前支持两种编译方式:
- bazel
- cmake。
bazel 推荐使用3.5.1及以后版本。
-
bazel 安装(仅供参考,还有其他方式)
# bazel 安装依赖jdk,先安装jdk apt install g++ unzip zip apt-get install default-jdk # 安装bazel mkdir -p /root/env/bazel wget https://github.com/bazelbuild/bazel/releases/download/3.5.1/bazel-3.5.1-installer-linux-x86_64.sh -O /root/env/bazel/bazel.sh chmod +x /root/env/bazel/bazel.sh /root/env/bazel/bazel.sh > /dev/null rm -rf /root/env # 查看版本 bazel --version
-
编译并运行 examples
仓库 clone 到本地之后,直接编译运行即可,具体如下:
# 进入根目录trpc-cpp cd trpc-cpp # 用bazel编译并运行框架提供的example示例 ./run_examples.sh
因为需要使用 cmake 的 FetchContent 特性来源码拉取第三方依赖,所以cmake 推荐使用3.14及以后版本。
-
cmake 安装(仅供参考,还有其他方式)
apt install cmake # 查看版本 cmake -version
-
编译并运行 examples
仓库 clone 到本地之后,直接编译运行即可,具体如下:
# 进入根目录trpc-cpp cd trpc-cpp # 用cmake编译并运行框架提供的example示例 ./run_examples_cmake.sh
-
安装及使用
同CentOS 部分。
需要将 bazel 可执行文件的目录加到环境变量 PATH 上,比如:在 .bash.rc
加入 export PATH=$PATH:/usr/local/bin/
-
方式1 yum
yum install centos-release-scl-rh centos-release-scl yum install devtoolset-7-gcc devtoolset-7-gcc-c++ scl enable devtoolset-7 bash
-
方式2 源码编译
// 下载源码 git clone git://gcc.gnu.org/git/gcc.git yourSomeLocalDir ./configure make make install
源码编译可能时间会比较久一些。
可能是网络问题导致拉取失败,考虑清理编译缓存(bazel clean --expunge)再次重试编译。
C++ 可能没有指定 c++17 标准
# 编译加上
build --cxxopt="--std=c++17"
也推荐在 .bazelrc
文件中加上,这样即可默认生效。
更多涉及编译的问题可以参考 bazel cmake faq。