为 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
我遇到了以下缺陷:
- grpc v1.43.0 克隆第 3 方子模块 protoc v3.18,构建后出现问题 - protoc 二进制文件在尝试生成时显示“找不到 cpp 插件”
为了克服这个问题,我已经将脚本第一部分中获得的资源复制到第二部分的第 3 方子文件夹中,以保证它是 3.19 - 然后在编译协议运行良好之后,插件就位,grpc链接到最新版本。
非常奇怪的问题,需要了解为什么它会克隆过时的版本,以及为什么 3.18 在与 3.19 相同的构建参数下没有插件
在 cmakelists find_package(Protobuf REQUIRED)
中完全失败
find_package(需要 gRPC)运行不正常:
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,这是一个标准变量。
我有一个 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
我遇到了以下缺陷:
- grpc v1.43.0 克隆第 3 方子模块 protoc v3.18,构建后出现问题 - protoc 二进制文件在尝试生成时显示“找不到 cpp 插件”
为了克服这个问题,我已经将脚本第一部分中获得的资源复制到第二部分的第 3 方子文件夹中,以保证它是 3.19 - 然后在编译协议运行良好之后,插件就位,grpc链接到最新版本。
非常奇怪的问题,需要了解为什么它会克隆过时的版本,以及为什么 3.18 在与 3.19 相同的构建参数下没有插件
在 cmakelists
find_package(Protobuf REQUIRED)
中完全失败find_package(需要 gRPC)运行不正常:
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,这是一个标准变量。