为 cpp 项目设置 protobuf 和 grpc 的正确方法是什么?

What is a correct way to setup protobuf and grpc for cpp project?

我有一个 cpp 项目,我想从源代码构建所有内容,以获取最新的链接。所以在我的项目根目录下,我创建了一个 3rd_party 文件夹和 assemble 以下脚本:

sudo apt-get install autoconf automake libtool curl make g++ unzip -y
git clone https://github.com/google/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig
cd ..

echo installing grpc
git clone --recurse-submodules -b v1.43.0 https://github.com/grpc/grpc
export MY_INSTALL_DIR=$HOME/.local
be sure that its exists
cd grpc
mkdir -p cmake/build
pushd cmake/build
cmake -DgRPC_INSTALL=ON       -DgRPC_BUILD_TESTS=OFF       -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR       ../..
make -j
make install
popd

我遇到了以下缺陷:

为了克服这个问题,我已经将脚本第一部分中获得的资源复制到第二部分的第 3 方子文件夹中,以保证它是 3.19 - 然后在编译协议运行良好之后,插件就位,grpc链接到最新版本。

非常奇怪的问题,需要了解为什么它会克隆过时的版本,以及为什么 3.18 在与 3.19 相同的构建参数下没有插件

Found package configuration file:
[cmake] 
[cmake]     /home/a/.local/lib/cmake/grpc/gRPCConfig.cmake
[cmake] 
[cmake]   but it set gRPC_FOUND to FALSE so package "gRPC" is considered to be NOT
[cmake]   FOUND.  Reason given by package:
[cmake] 
[cmake]   The following imported targets are referenced, but are missing:
[cmake]   protobuf::libprotobuf protobuf::libprotoc

问题

我如何编写脚本,在一个空文件夹中可以获得项目所需的与 grpc 第 3 方库和工具相关的所有内容?

以下是我采取的步骤:

$ mkdir .local
$ export INSTALL_PREFIX="$PWD/.local"
$ export CMAKE_GENERATOR=Ninja  # optional, but recommended

$ git clone --recurse-submodules -b v3.19.3 --depth 1 https://github.com/google/protobuf.git
$ pushd protobuf
$ ./autogen.sh
$ ./configure --prefix=$INSTALL_PREFIX
$ make -j$(nproc)
$ make install
$ popd

$ git clone --recurse-submodules -b v1.43.0 --depth 1 https://github.com/grpc/grpc.git
$ cmake -S grpc -B .build/grpc \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
    -DCMAKE_PREFIX_PATH=$INSTALL_PREFIX \
    -DgRPC_INSTALL=ON \
    -DgRPC_BUILD_TESTS=OFF \
    -DgRPC_PROTOBUF_PROVIDER=package \
    -DABSL_PROPAGATE_CXX_STD=ON
$ cmake --build .build/grpc --target install
...

$ mkdir example
$ echo "int main () { return 0; }" > example/main.cpp
$ vim example/CMakeLists.txt
$ cat example/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(example)

find_package(gRPC REQUIRED)

add_executable(main main.cpp)
target_link_libraries(main PRIVATE gRPC::grpc++)

$ cmake -S example -B .build/example \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_PREFIX_PATH=$INSTALL_PREFIX
$ cmake --build .build/example
...

我单独构建了 protobuf,因为 gRPC 在使用其内部 protobuf 构建时没有在 CMake 中正确设置其依赖项(我尝试了两种方法)。这涉及将 --prefix 传递给 protobuf 的 ./configure 脚本并将 -DgRPC_PROTOBUF_PROVIDER=package 传递给 gRPC 的 CMake 构建。后者是一个特定于 gRPC 的变量,告诉它不要构建 protobuf,而是搜索它。我通过设置 CMAKE_PREFIX_PATH 告诉 gRPC 在哪里可以找到 protobuf,这是一个标准变量。