【问题标题】:Cmake : find protobuf package in custom directoryCmake:在自定义目录中找到 protobuf 包
【发布时间】:2018-12-06 12:10:56
【问题描述】:

我有 cmake 3.10.x 并下载了当前的 protobuf 源 3.6.1。使用 cmake 我创建了这个库成功构建的 bin 目录“{PROTOBUF_SOURCE_DIR}/bin”。作为下一步,我想在我的基于 cmake 的项目中使用这个自定义树。我有

set ( Protobuf_USE_STATIC_LIBS ON )

find_package( Protobuf REQUIRED )
if ( Protobuf_FOUND )
    message( STATUS "Protobuf version : ${Protobuf_VERSION}" )
    message( STATUS "Protobuf include path : ${Protobuf_INCLUDE_DIRS}" )
    message( STATUS "Protobuf libraries : ${Protobuf_LIBRARIES}" )
else()
    message( WARNING "Protobuf package not found -> specify search path via PROTOBUF_ROOT variable")
endif()

但是如何为 cmake 指定我的自定义目录树以找到必要的东西。

如果我使用find_package( Protobuf REQUIRED PATHS ${PROTOBUF_ROOT}/bin/lib/cmake/protobuf ),那么我会看到 cmake 的以下输出:

Protobuf version : 3.6.1
Protobuf include path : 
Protobuf libraries :

如何让 cmake 找到包含路径、库和 protoc 编译器?

【问题讨论】:

  • 对于提示 CMake 关于安装 protobuf 的路径,您可以使用 CMAKE_PREFIX_PATH 变量,如我的回答中所述:stackoverflow.com/questions/34795816/…。选项PATH不是此类提示的正确方式,它改变了find_package()的模式(从MODULE到CONFIG),所以普通的documentation不适用。
  • 这不起作用:我添加了列表(APPEND CMAKE_PREFIX_PATH ${PROTOBUF_ROOT}/bin)但仍然看到相同的输出
  • 无论如何,从调用find_package(Protobuf) 中删除PATH 选项。如果这不起作用,那么您可能会提示错误的安装前缀。通常安装前缀有lib/include/子目录,

标签: c++ cmake protocol-buffers


【解决方案1】:

我终于有了一个解决方案——也许它会为别人节省很多时间

set ( Protobuf_USE_STATIC_LIBS ON )

include(${PROTOBUF_ROOT}/bin/lib/cmake/protobuf/protobuf-config.cmake)
include(${PROTOBUF_ROOT}/bin/lib/cmake/protobuf/protobuf-module.cmake)
include(${PROTOBUF_ROOT}/bin/lib/cmake/protobuf/protobuf-options.cmake)
include(${PROTOBUF_ROOT}/bin/lib/cmake/protobuf/protobuf-targets.cmake)

find_package( Protobuf REQUIRED HINTS ${PROTOBUF_ROOT}/bin/lib/cmake/protobuf )
if ( Protobuf_FOUND )
    message( STATUS "Protobuf version : ${Protobuf_VERSION}" )
    message( STATUS "Protobuf include path : ${Protobuf_INCLUDE_DIRS}" )
    message( STATUS "Protobuf libraries : ${Protobuf_LIBRARIES}" )
    message( STATUS "Protobuf compiler libraries : ${Protobuf_PROTOC_LIBRARIES}")
    message( STATUS "Protobuf lite libraries : ${Protobuf_LITE_LIBRARIES}")
else()
    message( WARNING "Protobuf package not found -> specify search path via PROTOBUF_ROOT variable")
endif()

【讨论】:

    【解决方案2】:

    这对我很有用,指向我的自定义 Windows 静态构建:

    set(Protobuf_USE_STATIC_LIBS ON)
    # add parent directory containing bin/protoc.exe, cmake/protobuf-config.cmake, lib/libprotobufd.lib (or .a), etc.
    list(APPEND CMAKE_PREFIX_PATH "/dir/where/protobuf/was/installed")
    find_package(Protobuf REQUIRED)
    

    由于某种原因,设置 Protobuf_DIRProtobuf_ROOT 不起作用。

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2017-05-16
      • 2012-09-29
      • 2011-04-14
      • 2017-02-02
      • 2018-10-27
      相关资源
      最近更新 更多