即使已安装 CMake 也无法找到 gRPC 库(mac)

Posted

技术标签:

【中文标题】即使已安装 CMake 也无法找到 gRPC 库(mac)【英文标题】:CMake is unable to find gRPC libraries even though they're installed (mac) 【发布时间】:2019-08-05 09:37:28 【问题描述】:

我正在尝试使用 gRPC 库,但是我不断收到错误消息,告诉我它找不到 .cmake 文件或者我收到链接器错误,这可能是由于我的 CMakeLists.txt。在examples I'm following 中,他们将 cmake 中的库简称为 gRPC,我也尝试过关键字 grpc_cpp_plugin,但似乎都不起作用。

对于上下文,我使用的是 macOS Mojave,并且我已经使用自制软件安装了 gRPC 库。

Homebrew 在/usr/local/Cellar/grpc/1.22.0 中安装了 gRPC 库。

我在这里使用了一个适用于另一个项目的 cmake 文件,但是我已经添加了 protobuf 和 gRPC 库,并且在添加它们之后出现错误。再次从上面的链接中借用了一些代码(特别是 gRPC 文件的名称)。

我的 CMakeLists.txt 文件

cmake_minimum_required( VERSION 2.8 )
project( gRPC_server )

# setup opencv
find_package( OpenCV REQUIRED )

# SETUP PROTOBUF
set(protobuf_MODULE_COMPATIBLE TRUE)
find_package( Protobuf REQUIRED )
set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)

# SETUP GRPC
find_package( gRPC REQUIRED )
set(_GRPC_GRPCPP_UNSECURE gRPC::grpc++_unsecure)

INCLUDE_DIRECTORIES($PROTOBUF_INCLUDE_DIR)

# mostly just to set it to the correct compiler
SET(CMAKE_CXX_FLAGS "-std=c++0x -Wall -g -Werror")

add_executable( server server.cpp compiled/image.grpc.pb.cc compiled/image.pb.cc )
target_link_libraries( server $OpenCV_LIBS $_GRPC_GRPCPP_UNSECURE $_PROTOBUF_LIBPROTOBUF )

add_executable( client client.cpp compiled/image.grpc.pb.cc compiled/image.pb.cc )
target_link_libraries( client $OpenCV_LIBS $_GRPC_GRPCPP_UNSECURE $_PROTOBUF_LIBPROTOBUF )

特别奇怪的是错误信息毫无意义

-- Found OpenCV: /opt/local (found version "3.4.3") 
-- Found Protobuf: /usr/local/lib/libprotobuf.a (found version "3.7.0") 
CMake Error at CMakeLists.txt:14 (find_package):
  By not providing "FindgRPC.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "gRPC", but
  CMake did not find one.

  Could not find a package configuration file provided by "gRPC" with any of
  the following names:

    gRPCConfig.cmake
    grpc-config.cmake

  Add the installation prefix of "gRPC" to CMAKE_PREFIX_PATH or set
  "gRPC_DIR" to a directory containing one of the above files.  If "gRPC"
  provides a separate development package or SDK, be sure it has been
  installed.

如果我注释掉 gRPC 内容,我会收到链接器错误。

感谢任何帮助,谢谢!

【问题讨论】:

您是否尝试将 grpc 安装位置添加到 CMAKE_PREFIX_PATH? (或包含 gRPCConfig.cmake 或 grpc-config.cmake 的文件夹) 这是我没有得到的一部分。我以前从未创建过 gRPCConfig.cmake 文件,而且我没有或不知道如何为 gRPC 构建一个。我也不知道CMAKE_PREFIX_PATH 是什么,但是我用谷歌搜索了它,它看起来只是我正在构建的目录的关键字,我认为它只是指回 .cmake 文件。 CMAKE_PREFIX_PATH 是 cmake 搜索库的文件夹列表(除了默认系统路径)。当你调用find_package 时,cmake 将搜索 FindXXX.cmake 模块。如果没有(grpc 没有这样的模块),cmake 在系统路径和CMAKE_PREFIX_PATH 中搜索配置文件(XXX-config.cmake 或 XXXConfig.cmake)。这些配置文件由库提供,而不是您提供。当您使用 cmake 构建和安装 grpc 时,配置文件应该放在安装文件夹中的某个位置(例如在 lib/cmake/grpc/ 中)。 潜在相关:github.com/grpc/grpc/issues/19873 【参考方案1】:

你必须通过 pkg-config 找到 gRPC。在 gRPC C++ QuickStart 中已经说明。

示例 cmake 代码:

find_package(PkgConfig REQUIRED)
pkg_search_module(GRPC REQUIRED grpc)
pkg_search_module(GRPCPP REQUIRED grpc++>=1.22.0)

我在自己的tensorflow-serving-client repo 中使用这些。

【讨论】:

这已经过时了——你现在可以使用find_package(gRPC CONFIG REQUIRED)... target_link_libraries(my_exe gRPC::grpc++)(见github.com/grpc/grpc/tree/master/src/cpp#cmake)

以上是关于即使已安装 CMake 也无法找到 gRPC 库(mac)的主要内容,如果未能解决你的问题,请参考以下文章

即使定义了搜索路径,也无法找到自定义共享库

为啥即使在搜索路径中列出了 GLEW 动态库,Xcode 也无法找到它?

如何使用 cmake 正确链接库?

CMake/Ninja 试图编译已删除的“.cpp”文件

Python face_recognition 无法安装

Cmake 无法在 Homebrew 中找到 boost_pyhton 库