我有一個 cpp 專案,我想從源代碼構建所有內容,以獲取最新的東西。所以在我的專案根目錄下,我創建了一個3rd_party檔案夾并組裝以下腳本:
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 克隆了 3rd 方子模塊 protoc v3.18,它在構建后出現問題 - protoc 二進制檔案在嘗試生成時說“找不到 cpp 插件”
為了克服這個問題,我將腳本第一部分中獲得的源代碼復制到第二部分的第 3 方子檔案夾中,以確保它是 3.19 - 然后在編譯協議作業正常之后,插件就位,并且 grpc 鏈接到最新版本.
非常奇怪的問題,需要了解為什么它會克隆過時的版本,以及為什么 3.18 在與 3.19 相同的構建引數下沒有插件
在 cmakelists 中完全
find_package(Protobuf REQUIRED)失敗find_package( gRPC REQUIRED ) 運行不正常:
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 3rd 方庫和工具相關的所有內容?
uj5u.com熱心網友回復:
以下是我采取的步驟:
$ 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,而是搜索它。我通過設定告訴 gRPC 在哪里可以找到 protobuf CMAKE_PREFIX_PATH,這是一個標準變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410793.html
標籤:
上一篇:在C 中決議文本檔案行
下一篇:有沒有辦法只回傳C 中的失敗?
