使用
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
有什么问题吗?
3条答案
按热度按时间sg3maiej1#
看起来cmake API有点变化。试试把它改成
这将直接将生成的文件添加到目标的源列表中。查看
protobuf-config.cmake
中的protobuf_generate
函数以了解新选项。vbkedwbf2#
现有的answers帮助了我,但错过了很多关于发生了什么的解释。
find_package可以在MODULE模式或CONFIG模式下工作。在MODULE模式下,它搜索
Find\<package\>.cmake
(通常由cmake拥有)。在CONFIG模式下,它搜索\<package\>Config.cmake
(由软件包提供)。cmake和protocol buffers都可以提供
protobuf_generate_cpp()
的实现:使用PATHS提示将cmake置于CONFIG模式,这样如果它能找到Config.cmake模块,它将使用protobuf提供的实现。
在这种情况下,protobuf_generate_cpp()来自config.cmake,它需要:
因为@HaxtraZ提到配置模块包含:
如果使用FindProtobuf模块,则不需要此功能,因此未在此处记录。
尽管这并不是cmake的错,但cmake可以就可能的冲突发出警告。如果在这里提出:
我还在这里向protocol buffers项目报告了由于缺少文档而导致的混乱:
注意:在某些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)会失败。
bxpogfeg3#
您需要**
protobuf_MODULE_COMPATIBLE
**。我用的是CMake3.14。
protobuf-config.cmake
的最后3行是:并且
protobuf_generate_cpp()
被定义在protobuf-module.cmake
中。所以,为了
protobuf_generate_cpp()
,人们必须在他们的CMakeLists.txt中打开protobuf_MODULE_COMPATIBLE
:请记住清理您以前生成的cmake缓存文件,然后再次调用cmake。