1

我正在尝试将 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

并得到一个错误:

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!

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

./configure --prefix=$PREFIX
make && make install

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

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

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

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

4

2 回答 2

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”会找到它。

于 2019-02-22T02:15:32.167 回答
-1

请在项目的 Cmakelists 中找到包 gRPC。如果可能的话,还可以找到包关心。所以加法看起来像

find_package(需要 gRPC) find_package(需要 c-ares)

还请查看链接: CMake:如果您仍然需要指定 CMAKE_MODULE_PATH,那么 find_package() 有什么用?

于 2018-06-15T13:41:00.390 回答