【问题标题】:Building grpc from source using preinstalled packages使用预安装的包从源代码构建 grpc
【发布时间】:2018-11-25 06:34:02
【问题描述】:

我正在尝试将 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 解析器)?

【问题讨论】:

  • can I build and install gRPC without updating c-ares to github-version? - 您可以自己编写“config”文件,并将其放在适当的目录中,靠近包。或者,您可以编写“查找”脚本来查找包。该脚本应该放在某个地方,添加它的目录应该通过CMAKE_MODULE_PATH 参数传递给cmake。

标签: cmake grpc c-ares


【解决方案1】:

c-ares 有两个在这里使用的构建系统,CMake 和 autotools。它支持两者,但您需要选择一个。 autotools 的存在时间较长,是传统上用于 UNIX 环境的一种。来自 Linux 发行版的 c-ares 二进制包将使用自动工具,例如如果您dnf install c-ares-devel,您将获得基于自动工具的 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 运行 cmake 时尝试定义 -D_gRPC_CARES_LIBRARIES=cares-DgRPC_CARES_PROVIDER=kludge。这将 gRPC CMake 代码伪装成不寻找 c-ares 并假设“-lcares”会找到它。

【讨论】:

    【解决方案2】:

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

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

    还可以查看链接: CMake: Of what use is find_package() if you need to specify CMAKE_MODULE_PATH anyway?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2012-06-11
      相关资源
      最近更新 更多