无法在 ROS 中使用本地安装的 Protocol Buffer

2023-12-19

我已经安装了协议缓冲区 https://developers.google.com/protocol-buffers/本地。 ROS包的目录结构如下:

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

协议缓冲区 https://developers.google.com/protocol-buffers/是通过使用本地安装的./configure --prefix=$PWD inside lib/protobuf-3.5.0目录。

编译ROS包时使用catkin_make,它似乎指的是协议缓冲区的旧安装并显示版本不兼容错误。

[  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 Protocol Buffers ${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
)

To this:

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

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

请参阅搜索路径文档find_package here. https://cmake.org/cmake/help/v3.5/command/find_package.html(大约在页面的一半处)

我相信如果你在 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 在通过以下方式进行构建时不会安装 CMake 配置./configure ...。要安装 CMake 配置,我必须通过 CMake 进行构建:

cd protobuf-3.5/cmake
cmake -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> .
make
make install
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 ROS 中使用本地安装的 Protocol Buffer 的相关文章

随机推荐