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

Building grpc from source using preinstalled packages

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

请在您项目的Cmakelists中找到包gRPC。可能的话也找包管事。所以添加看起来像

find_package(需要 gRPC) find_package(需要战神)

另请查看 link: CMake: Of what use is find_package() if you need to specify CMAKE_MODULE_PATH anyway?

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 以获得更好的 c-ares 查找模块,该模块可与 pkgconfig 文件一起使用。 CMake 支持 pkgconfig 文件,因为它们在 CMake 存在之前被广泛使用并且仍然被广泛使用,所以后者并不难。

或者,当 运行 cmake 用于 gRPC 时,尝试定义 -D_gRPC_CARES_LIBRARIES=cares-DgRPC_CARES_PROVIDER=kludge。这会伪造 gRPC CMake 代码,使其不寻找 c-ares 并假设“-lcares”会找到它。