CMake找不到Protobuf `protobuf_generate_cpp`

92vpleto  于 2023-05-22  发布在  其他
关注(0)|答案(3)|浏览(509)

使用

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的安装文件夹,有一个包含函数定义的CMake文件<istall path>/cmake/protobuf-module.cmake

CMake    version: 3.10.2
Protobuf version: 3.6.1

有什么问题吗?

sg3maiej

sg3maiej1#

看起来cmake API有点变化。试试把它改成

protobuf_generate(
 LANGUAGE cpp
 TARGET <YOUR_TARGET_NAME> 
 PROTOS Foo.proto)

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

vbkedwbf

vbkedwbf2#

现有的answers帮助了我,但错过了很多关于发生了什么的解释。
find_package可以在MODULE模式或CONFIG模式下工作。在MODULE模式下,它搜索Find\<package\>.cmake(通常由cmake拥有)。在CONFIG模式下,它搜索\<package\>Config.cmake(由软件包提供)。
cmake和protocol buffers都可以提供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)

使用PATHS提示将cmake置于CONFIG模式,这样如果它能找到Config.cmake模块,它将使用protobuf提供的实现。
在这种情况下,protobuf_generate_cpp()来自config.cmake,它需要:

set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")

因为@HaxtraZ提到配置模块包含:

if(protobuf_MODULE_COMPATIBLE)
   include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
endif()

如果使用FindProtobuf模块,则不需要此功能,因此未在此处记录。
尽管这并不是cmake的错,但cmake可以就可能的冲突发出警告。如果在这里提出:

https://gitlab.kitware.com/cmake/cmake/issues/21228

我还在这里向protocol buffers项目报告了由于缺少文档而导致的混乱:

https://github.com/protocolbuffers/protobuf/issues/7912

注意:在某些Linux安装(至少是CentOS7和Debian 9)上,默认情况下通常使用configure/make而不是cmake生成协议缓冲区,后者根本不安装cmake配置文件。所以find_package(protobuf 3.5.0 REQUIRED)会正常工作,但是find_package(protobuf 3.5.0 REQUIRED PATH I/only/wanted/to/help)会失败。

bxpogfeg

bxpogfeg3#

您需要**protobuf_MODULE_COMPATIBLE**。
我用的是CMake3.14。protobuf-config.cmake的最后3行是:

if(protobuf_MODULE_COMPATIBLE)
  include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
endif()

并且protobuf_generate_cpp()被定义在protobuf-module.cmake中。
所以,为了protobuf_generate_cpp(),人们必须在他们的CMakeLists.txt中打开protobuf_MODULE_COMPATIBLE

set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")

请记住清理您以前生成的cmake缓存文件,然后再次调用cmake。

相关问题