问题实际上出在您使用的项目上find_package()
及其包文件(/usr/lib64/cmake/grpc/gRPCConfig.cmake
在你的情况下)。错误信息
The following imported targets are referenced, but are missing:
意味着包文件引用了 IMPORTED 目标,但它们从未定义。
该问题的常见原因如下:
在其自己的构建过程中,该项目使用find_package()
对于一些其他包。这find_package()
call 定义了 IMPORTED 目标,这些目标在项目中用于链接。
它的包文件包含由以下命令创建的脚本install(EXPORT)
命令并根据install(TARGETS ... EXPORT ...)
命令。此包含的脚本使用 IMPORTED 目标,但未定义它们。
项目的包文件forgets to use find_package
, 或更好,查找依赖项 https://cmake.org/cmake/help/v3.9/module/CMakeFindDependencyMacro.html用于为包含的脚本定义 IMPORTED 目标。
如果您不想修复(其他)项目的包文件,那么最直接的解决方案是添加错过的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
包文件旨在包含调用find_package(Protobuf)
。它的模板cmake/gRPCConfig.cmake.in https://github.com/grpc/grpc/blob/master/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 https://github.com/grpc/grpc/blob/master/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)