c++ - 无法在 ROS 中使用本地安装的 Protocol Buffers

标签 c++ cmake protocol-buffers ros

我已经安装了Protocol Buffers本地。下面是ROS包的目录结构:

.
├── CMakeLists.txt
├── package.xml
├── include
│   ├── addressbook.pb.cc
│   ├── addressbook.pb.h
│   └── addressbook.proto
├── lib
│   └── protobuf-3.5.0
└── src
    └── main.cpp

Protocol Buffers通过在 lib/protobuf-3.5.0 目录中使用 ./configure --prefix=$PWD 在本地安装。

在使用 catkin_make 编译 ROS 包时,它似乎指的是 Protocol Buffers 的旧安装并显示版本不兼容错误。

[  0%] Building CXX object local_protobuf_ros_example/CMakeFiles/addressbook_protobuf.dir/include/addressbook.pb.cc.o
In file included from /home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.cc:4:0:
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
 #error This file was generated by a newer version of protoc which is
  ^
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
 #error incompatible with your Protocol Buffer headers.  Please update
  ^
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:14:2: error: #error your headers.
 #error your headers.
  ^
In file included from /home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.cc:4:0:
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:23:35: fatal error: google/protobuf/arena.h: No such file or directory
 #include <google/protobuf/arena.h>
                                   ^
compilation terminated.

尽管如此,我将 message(STATUS "Using Protobuf_VERSION}") 语句放在 CMakeLists.txt 中,发现它使用的是 Protocol Buffers 3.5.0 .请参阅下面的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
project(local_protobuf_ros_example)

find_package(catkin REQUIRED COMPONENTS roscpp)

set(PROTOBUF_FOLDER ${PROJECT_SOURCE_DIR}/lib/protobuf-3.5.0)

set(CMAKE_PREFIX_PATH
    ${CMAKE_PREFIX_PATH}
    "${PROTOBUF_FOLDER}/cmake/build/release/lib/x86_64-linux-gnu/cmake/protobuf"
)

find_package(Protobuf CONFIG REQUIRED)
message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}")

catkin_package()
include_directories(include ${catkin_INCLUDE_DIRS} ${PROTOBUF_INCLUDE_DIRS})

add_library(addressbook_protobuf include/addressbook.pb.cc)

add_executable(main src/main.cpp)
target_link_libraries(main ${catkin_LIBRARIES} addressbook_protobuf ${PROTOBUF_LIBRARIES})

这里缺少什么?由于我指的是本地安装,它应该可以正常工作而不会显示错误。不是吗?

最佳答案

你的一组CMAKE_PREFIX_PATH是不正确的。它应该指向安装 protobuf 的前缀,而不是包的 cmake 配置文件的位置。

所以尝试改变:

set(CMAKE_PREFIX_PATH
    ${CMAKE_PREFIX_PATH}
    ${PROTOBUF_FOLDER}/cmake/build/release/lib/x86_64-linux-gnu/cmake/protobuf
)

对此:

set(CMAKE_PREFIX_PATH
    ${CMAKE_PREFIX_PATH}
    ${PROTOBUF_FOLDER}
)

也就是说,假设 ${PROTOBUF_FOLDER}指向与 ./configure --prefix=<INSTALL_PREFIX> 的 --prefix 参数相同的位置

请参阅 find_package 的搜索路径文档here. (大约在页面的一半)

我相信如果你在 Windows 上,你的工作方式会是 <prefix>/是该平台的搜索路径之一。但是在基于 Unix 的操作系统上,您将这些作为搜索路径(根据上面链接上的文档):

<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/
<prefix>/(lib/<arch>|lib|share)/<name>*/
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/

在这里您还必须注意区分大小写。请注意,在上述路径中,他们搜索的最后一个路径元素是 <name>* .从我在你的问题中看到的情况来看,protobuf 似乎以名称安装了自己 'protobuf',但是你的 find_package调用要求“Protobuf”。因此,也请尝试将您的调用更改为:

find_package(protobuf CONFIG REQUIRED)

最后,据我所知,protobuf 在通过 ./configure ... 进行构建时不会安装 CMake 配置。 .要安装 CMake 配置,我必须通过 CMake 进行构建:

cd protobuf-3.5/cmake
cmake -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> .
make
make install

关于c++ - 无法在 ROS 中使用本地安装的 Protocol Buffers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786852/

相关文章:

c++ - 在分析 boost::graph 时,是否对顶点和边描述符或它们的迭代器进行操作?

c++ - 我必须在我的应用程序中包含所有这些 Qt dll 吗?

cmake - 带有特殊字符的 custom_command ECHO

python - CUDA 8.0 和 cuDNN 5.1 在 Ubuntu 16.04 上的 Caffe 安装错误

c++ - 如何使用 CMake 和 Eclipse CDT 自动删除构建文件?

node.js - 我应该安装哪个 Node.js 模块才能使用谷歌 Protocol Buffer ?

c++ - 在渲染 C++ 之前从视频源编辑帧

c++ - 初始化变量列表中的赋值顺序是否未定义?

java - 如何在protobuf3中将 map 添加到消息中

node.js - gRPC Node 服务器: how to load protobuf file from a different Git repo?