首页 > 解决方案 > grpc 找不到 protobuf 库

问题描述

我检查了 grpc 安装并完成了构建和安装。

现在,当我尝试:

find_package(gRPC CONFIG REQUIRED)

我明白了

CMake Error at CMakeLists.txt:15 (find_package):
  Found package configuration file:

    /usr/lib64/cmake/grpc/gRPCConfig.cmake

  but it set gRPC_FOUND to FALSE so package "gRPC" is considered to be NOT
  FOUND.  Reason given by package:

  The following imported targets are referenced, but are missing:
  protobuf::libprotobuf protobuf::libprotoc

事件虽然

find_package(Protobuf REQUIRED)

工作得很好。

我读到我应该跑去cmake ../.. -DBUILD_DEPS=ON -DBUILD_SHARED_LIBS=ON解决这个问题。然而,这导致:

CMake Error at cmake/abseil-cpp.cmake:38 (find_package):
  Could not find a package configuration file provided by "absl" with any of
  the following names:

    abslConfig.cmake
    absl-config.cmake

  Add the installation prefix of "absl" to CMAKE_PREFIX_PATH or set
  "absl_DIR" to a directory containing one of the above files.  If "absl"
  provides a separate development package or SDK, be sure it has been
  installed.
Call Stack (most recent call first):
  CMakeLists.txt:191 (include)


-- Configuring incomplete, errors occurred!
See also "/home/ray/CLionProjects/grpc/grpc/CMakeFiles/CMakeOutput.log".
See also "/home/ray/CLionProjects/grpc/grpc/CMakeFiles/CMakeError.log".

/usr/lib64/cmake/grpc/gRPCConfig.cmake 的内容

# Module path
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/modules)

# Depend packages






# Targets
include(${CMAKE_CURRENT_LIST_DIR}/gRPCTargets.cmake)

标签: c++cmakeprotocol-buffersgrpc

解决方案


问题实际上在于您使用的项目find_package()及其包文件(/usr/lib64/cmake/grpc/gRPCConfig.cmake在您的情况下)。错误信息

The following imported targets are referenced, but are missing:

意味着,包文件引用了 IMPORTED 目标,但它们从未被定义。

该问题的通常原因如下:

  1. 在它自己的构建过程中,该项目find_package()用于其他一些包。此find_package()调用定义了 IMPORTED 目标,这些目标在项目中用于链接。

  2. 它的包文件包括脚本,它是由install(EXPORT)命令创建并根据install(TARGETS ... EXPORT ...)命令填充的。这个包含的脚本使用 IMPORTED 目标,但没有定义它们。

  3. 项目的包文件忘记使用find_package,或者更好的是find_dependency来定义包含脚本的 IMPORTED 目标。

如果您不想修复(其他)项目的包文件,那么最直接的解决方案是将missed添加find_package到您自己的项目中:

# Hack: This will define IMPORTED targets, needed for gRPC project, but not defined by it.
find_package(Protobuf REQUIRED)
# Now perform the original 'find_package' call.
find_package(gRPC CONFIG REQUIRED)

实际上,gRPCConfig.cmake包文件旨在包含 call find_package(Protobuf)。它的模板cmake/gRPCConfig.cmake.in如下:

# Module path
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/modules)

# Depend packages
@_gRPC_FIND_ZLIB@
@_gRPC_FIND_PROTOBUF@
@_gRPC_FIND_SSL@
@_gRPC_FIND_CARES@
@_gRPC_FIND_ABSL@

# Targets
include(${CMAKE_CURRENT_LIST_DIR}/gRPCTargets.cmake)

并且在替换时,变量_gRPC_FIND_PROTOBUF应该发出以下代码:

if(NOT Protobuf_FOUND AND NOT PROTOBUF_FOUND)
  find_package(Protobuf ${gRPC_PROTOBUF_PACKAGE_TYPE})
endif()

(该变量应在cmake/protobuf.cmake中设置)。

但是出了点问题,结果/usr/lib64/cmake/grpc/gRPCConfig.cmake包含空变量的替换:

# Module path
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/modules)

# Depend packages






# Targets
include(${CMAKE_CURRENT_LIST_DIR}/gRPCTargets.cmake)

推荐阅读