无法在 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 的相关文章

  • ServiceStack 验证并不总是触发

    因此 我尝试使用 RavenDB 和 ServiceStack 构建端到端集成测试套件 但遇到了一个非常奇怪的问题 即验证无法对某些请求运行 这真的很奇怪 我不确定我做错了什么 我正在使用 NCrunch 有时测试通过 有时失败 希望这是一
  • C# 中的通用 foreach 循环

    给出以下代码的编译器告诉我 使用未分配的局部变量 x 有什么想法吗 public delegate Y Function
  • C# 如何比较两个字符串并指出哪些部分不同

    例如 如果我有 string a personil string b personal 我想得到 string c person i l 然而 它不一定是单个字符 我也可以这样 string a disfuncshunal string b
  • 为什么 Resources.Load 返回 null?

    我的项目有多个精灵 位于 Assets Sprites 中 我想使用 C 脚本加载它们 我已经测试过这个 Sprite myFruit Resources Load
  • C 程序的“编译器正确”命令

    这是关于中提到的编译步骤Linux 期刊文章 https www linuxjournal com article 6463 C 程序是使用编译的cpp cc1 as and ld该文章中的命令 我能够执行这些步骤cpp as and ld
  • Cmake 链接到共享库找不到​​库

    在 Ubuntu 上 我有两个目录 build and src In src my CMakeLists txt文件有以下几行 add executable Test main cpp target link libraries Test
  • 与智能指针的返回类型协方差

    在 C 中我们可以这样做 struct Base virtual Base Clone const virtual Base struct Derived Base virtual Derived Clone const overrides
  • 托管 C++ 和 AnyCPU

    我有一个托管 C dll 我从 C 项目中引用它 C 项目将被编译为 AnyCPU 有没有办法编译 32 位和 64 位版本的托管 C dll 然后告诉 C 项目在运行时根据正在运行的体系结构加载正确的版本 让 AnyCPU dll 与 C
  • 再次对存储库和持久性一无所知

    这就是我要做的 我有一个通用的存储库类Repository
  • 将supportedRuntime嵌入到exe文件中

    我需要将仅包含supportedRuntime 设置的app config 文件嵌入到我的exe 文件中 我尝试执行构建操作嵌入资源 但它现在没有从配置文件中读取值 并且它不起作用 这是我的配置文件
  • 创建新视图时如何初始化视图模型中的属性?

    我有一个应用程序 可以打开一个视图 允许您搜索数据 然而 为了进行搜索 用户必须选择他想要在什么类别下进行搜索 目前 我正在尝试弄清楚如何将所选类别从主视图模型 作为 int 传递到新搜索视图的视图模型 目前我正在尝试在主视图中使用类似的东
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • LINQ 分组依据和选择集合

    我有这个结构 Customer has many Orders has many OrderItems 我想生成一个列表CustomerItems通过 LINQ 给出的子集OrderItems List of new Customer Li
  • HTTP 错误 500.35 - ANCM 同一进程中的多个进程内应用程序 ASP.NET Core 3

    从今天早上开始 没有对项目代码进行任何更改 一个非常简单的 Web API 一个控制器和 3 个方法 使用 Swagger 它不再启动 我收到错误 HTTP 错误 500 35 ANCM 同一进程中有多个进程内应用程序 事件查看器报告最无用
  • c++ string::size 中的 CharT 元素是什么?

    From http en cppreference com w cpp string basic string size http en cppreference com w cpp string basic string size 的数量
  • STL迭代器是否保证集合更改后的有效性?

    假设我有某种集合 并且我在它的开头获得了一个迭代器 现在假设我修改了该集合 无论集合或迭代器的类型如何 我仍然可以安全地使用迭代器吗 为了避免混淆 以下是我讨论的操作顺序 获取集合的迭代器 修改集合 显然 不是其中的元素 而是集合本身 使用
  • 索引 getter 中的 IndexOutOfRangeException

    在我的索引属性中 我检查索引是否超出范围 如果是的话 我抛出一个IndexOutOfBoundsException 当我运行代码分析器 在 VS12 中 时 它抱怨 CA1065 意外位置出现意外异常 参考CA1065的描述 仅 Syste
  • SQL 注入在 winform 中有效吗?

    我正在用 C 制作一个 Windows 软件 我读过关于sql injection但我没有发现它适用于我的应用程序 SQL 注入在 winform 中有效吗 如果是的话如何预防 EDIT 我正在使用文本框来读取用户名和密码 通过使用 tex
  • 提高大型结构列表的二进制序列化性能

    我有一个以 3 个整数保存 3d 坐标的结构 在测试中 我将 100 万个随机点放在一起 List 然后对内存流使用二进制序列化 内存流大小约为 21 MB 这似乎非常低效 因为 1000000 点 3 坐标 4 字节应该至少为 11MB
  • JSON.NET 序列化 JObject,同时忽略 null 属性

    我有一个JObject它被用作template用于调用 RESTful Web 服务 这JObject通过解析器创建 并且由于它用作模板告诉用户端点架构是什么样子 所以我必须找到一种方法来保留所有属性 这就是为什么我将它们的值默认为null

随机推荐