使用
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。
CMake version: 3.10.2
Protobuf version: 3.6.1这里有什么问题?
发布于 2019-01-18 12:31:14
看来cmake有了一点变化。试着把它改成
protobuf_generate(
LANGUAGE cpp
TARGET <YOUR_TARGET_NAME>
PROTOS Foo.proto)这将直接将生成的文件添加到目标的源列表中。查看一下protobuf_generate函数在protobuf-config.cmake中的新选项。
发布于 2020-09-23 22:27:21
现有的答案帮助了我,但忽略了对正在发生的事情的很多解释。
套餐可以在模块模式或配置模式下工作。在模块模式下,它搜索Find\<package\>.cmake (通常由cmake拥有)。在配置模式下,它搜索\<package\>Config.cmake (由包提供)。
cmake和协议缓冲区都可以为protobuf_generate_cpp()提供一个实现。
>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,它需要:
set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")因为@HaxtraZ提到了config模块包含:
if(protobuf_MODULE_COMPATIBLE)
include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
endif()如果使用FindProtobuf模块,这并不是必需的,因此没有文档化。
虽然这并不是真正的责任,但cmake可以警告可能发生的冲突。如果在此提出这一点:
https://gitlab.kitware.com/cmake/cmake/-/issues/21228我还在这里报告了由于缺少文档而给协议缓冲区项目造成的混乱:
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)将失败。
https://stackoverflow.com/questions/52533396
复制相似问题