首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake找不到Protobuf `protobuf_generate_cpp`

CMake找不到Protobuf `protobuf_generate_cpp`
EN

Stack Overflow用户
提问于 2018-09-27 09:10:01
回答 2查看 9.5K关注 0票数 8

使用

代码语言:javascript
复制
find_package(Protobuf REQUIRED
    PATHS ${PROTOBUF_SEARCH_PATH}
)

if (NOT ${Protobuf_FOUND})
    message( FATAL_ERROR "Could not find Protobuf!" )
endif()    

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS Foo.proto)

我收到一条错误消息Unknown CMake command "protobuf_generate_cpp"。如果我检查Protobuff的Install文件夹,就会有一个包含函数定义的CMake文件<istall path>/cmake/protobuf-module.cmake

代码语言:javascript
复制
CMake    version: 3.10.2
Protobuf version: 3.6.1

这里有什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-18 12:31:14

看来cmake有了一点变化。试着把它改成

代码语言:javascript
复制
protobuf_generate(
 LANGUAGE cpp
 TARGET <YOUR_TARGET_NAME> 
 PROTOS Foo.proto)

这将直接将生成的文件添加到目标的源列表中。查看一下protobuf_generate函数在protobuf-config.cmake中的新选项。

票数 13
EN

Stack Overflow用户

发布于 2020-09-23 22:27:21

现有的答案帮助了我,但忽略了对正在发生的事情的很多解释。

套餐可以在模块模式或配置模式下工作。在模块模式下,它搜索Find\<package\>.cmake (通常由cmake拥有)。在配置模式下,它搜索\<package\>Config.cmake (由包提供)。

cmake和协议缓冲区都可以为protobuf_generate_cpp()提供一个实现。

代码语言:javascript
复制
>grep -ri 'function(PROTOBUF_GENERATE_CPP' /opt/cmake-3.18.1/ 
/opt/cmake-3.18.1/share/cmake-3.18/Modules/FindProtobuf.cmake:function(PROTOBUF_GENERATE_CPP SRCS HDRS)
>grep -ri 'function(PROTOBUF_GENERATE_CPP' /opt/protobuf-3.5.0/
/opt/protobuf-3.5.0/lib64/cmake/protobuf/protobuf-module.cmake:function(PROTOBUF_GENERATE_CPP SRCS HDRS)

使用路径提示使cmake进入配置模式,以便如果它能够找到Config.cmake模块,它将使用protobuf提供的实现。

在本例中,protobuf_generate_cpp()来自config.cmake,它需要:

代码语言:javascript
复制
set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")

因为@HaxtraZ提到了config模块包含:

代码语言:javascript
复制
if(protobuf_MODULE_COMPATIBLE)
   include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
endif()

如果使用FindProtobuf模块,这并不是必需的,因此没有文档化。

虽然这并不是真正的责任,但cmake可以警告可能发生的冲突。如果在此提出这一点:

代码语言:javascript
复制
https://gitlab.kitware.com/cmake/cmake/-/issues/21228

我还在这里报告了由于缺少文档而给协议缓冲区项目造成的混乱:

代码语言:javascript
复制
https://github.com/protocolbuffers/protobuf/issues/7912

注意:某些Linux安装(至少是CentOS7和Debian9)的默认设置通常是使用配置/make生成协议缓冲区,而不是使用根本不安装cmake配置文件的cmake。因此,find_package(Protobuf3.5.0必需的)可以工作,但是find_package(Probuf3.5.0必需的路径i/only/to/help)将失败。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52533396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档