使用预安装的软件包从源代码构建 grpc

Ser*_*hik 1 cmake c-ares grpc

我正在尝试将 gRPC 集成到现有项目中。它已经有包含安装的所有 gRPC 依赖项(ssl、c-ares、protobuf 和 zlib)的目录。我想在构建 gRPC 时使用它们,并将 gRPC 安装到同一目录中。我下载了 gRPC 存档(没有克隆位于 grpc/third_party/ 中的子模块),并尝试生成构建系统,用于构建 gRPC 并将其安装到我的目标文件夹中(使用 cmake)。

我使用了以下命令:

cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DgRPC_ZLIB_PROVIDER=package -DgRPC_PROTOBUF_PROVIDER=package -DgRPC_SSL_PROVIDER=package -DgRPC_CARES_PROVIDER=package
Run Code Online (Sandbox Code Playgroud)

并得到一个错误:

CMake Error at cmake/cares.cmake:34 (find_package):
Could not find a package configuration file provided by "c-ares" with any
of the following names:

c-aresConfig.cmake
c-ares-config.cmake
Add the installation prefix of "c-ares" to CMAKE_PREFIX_PATH or set
"c-ares_DIR" to a directory containing one of the above files.  If "c-ares"
provides a separate development package or SDK, be sure it has been
installed.
Call Stack (most recent call first):
CMakeLists.txt:116 (include)
-- Configuring incomplete, errors occurred!
Run Code Online (Sandbox Code Playgroud)

我有 1.14.0 版的 c-ares(来自https://c-ares.haxx.se/),它是使用构建的

./configure --prefix=$PREFIX
make && make install
Run Code Online (Sandbox Code Playgroud)

并且它不提供任何上述文件(c-aresConfig.cmake、c-ares-config.cmake)。

我尝试从github获取c-ares并使用cmake构建它,并成功:请求的文件出现在安装目录中,因此gRPC构建系统成功生成。

我的问题是:我可以在不将 c-ares 更新到 github-version 的情况下构建和安装 gRPC 吗?

如果这不能轻松完成,也许可以以某种方式禁用 gRPC 中 c-ares 的使用(改为使用本机 dns 解析器)?

Tre*_*ntP 5

c-ares 有两个在这里使用的构建系统,CMake 和 autotools。它支持两者,但您需要选择一个。autotools 出现的时间更长,是 UNIX 环境中传统上使用的一种。来自 Linux 发行版的 c-ares 二进制包将使用 autotools,例如,如果您dnf install c-ares-devel,您将获得基于 autotools 的 c-ares 构建。

autotools 构建系统会安装一个 pkgconfig 文件,libcares.pc以提供有关如何使用 c-ares 的信息。安装 CMake 系统c-ares-config.cmake来执行此操作。

所以这里的问题是您正在使用 autotools 构建 c-ares,但 gRPC 只考虑了 CMake 将被用于构建 c-ares 的可能性。

因此,您可以切换到使用 CMake 构建 c-ares 或修补 gRPC,以便更好地查找可与 pkgconfig 文件一起使用的 c-ares 模块。CMake 支持 pkgconfig 文件,因为它们在 CMake 存在之前被广泛使用并且仍然被广泛使用,所以后者并不难。

或者,尝试为 gRPC定义-D_gRPC_CARES_LIBRARIES=cares-DgRPC_CARES_PROVIDER=kludge运行 cmake 时。这将 gRPC CMake 代码伪装成不寻找 c-ares 并假设“-lcares”会找到它。