grpc 找不到 protobuf 库
grpc can't find protobuf library
我检查了 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)
问题实际上出在您通过 find_package()
使用的项目及其包文件(在您的情况下为 /usr/lib64/cmake/grpc/gRPCConfig.cmake
)。错误信息
The following imported targets are referenced, but are missing:
意味着,包文件引用了 IMPORTED 目标,但它们从未被定义。
该问题的常见原因如下:
在其自己的构建过程中,该项目使用 find_package()
用于其他一些包。此 find_package()
调用定义了 IMPORTED 目标,这些目标在项目中用于 link.
它的包文件包含脚本,由install(EXPORT)
命令创建并根据install(TARGETS ... EXPORT ...)
命令填充。此包含的脚本使用 IMPORTED 目标,但未定义它们。
项目的包文件忘记使用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
包文件旨在包含调用 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)
我检查了 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)
问题实际上出在您通过 find_package()
使用的项目及其包文件(在您的情况下为 /usr/lib64/cmake/grpc/gRPCConfig.cmake
)。错误信息
The following imported targets are referenced, but are missing:
意味着,包文件引用了 IMPORTED 目标,但它们从未被定义。
该问题的常见原因如下:
在其自己的构建过程中,该项目使用
find_package()
用于其他一些包。此find_package()
调用定义了 IMPORTED 目标,这些目标在项目中用于 link.它的包文件包含脚本,由
install(EXPORT)
命令创建并根据install(TARGETS ... EXPORT ...)
命令填充。此包含的脚本使用 IMPORTED 目标,但未定义它们。项目的包文件忘记使用
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
包文件旨在包含调用 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)