无法从 cpp 代码运行 image_transport:“分段错误(核心转储)”

Posted

技术标签:

【中文标题】无法从 cpp 代码运行 image_transport:“分段错误(核心转储)”【英文标题】:Not able to run image_transport from cpp code: `Segmentation fault (core dumped)` 【发布时间】:2016-07-18 05:18:01 【问题描述】:

我将image_transport 包含在我的CMake 文件和packake.xml 中。我在 ubuntu 16 上使用 ROS Kineltic,尽管我在 ubuntu 14 上使用 ros indigo 和玉石遇到了同样的问题。

我的 CMake 文件如下:

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  image_transport
  roscpp
  rospy
  std_msgs
  message_generation
  genmsg
  )

generate_messages(
  DEPENDENCIES
  std_msgs
  )

catkin_package(
  CATKIN_DEPENDS  cv_bridge image_transport roscpp rospy std_msgs message_generation
  )
    include_directories(
   $catkin_INCLUDE_DIRS
   ) 
....

而我的package.xml

<buildtool_depend>catkin</buildtool_depend>
 <build_depend>cv_bridge</build_depend>
  <build_depend>image_transport</build_depend>
  <build_depend>roscpp</build_depend>
 <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>
   <run_depend>cv_bridge</run_depend>
  <run_depend>image_transport</run_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
 <run_depend>std_msgs</run_depend>
  <run_depend>message_runtime</run_depend>
 <run_depend>message_generation</run_depend>
    <run_depend>image_transport</run_depend>

在我的 .cpp 文件中

#include <ros/ros.h>
#include <image_transport/image_transport.h>
.....
int main(int argc, char **argv)


  ros::init(argc, argv, "imagegraber");
  ros::NodeHandle nodea;

 image_transport::ImageTransport it(nodea);

image_transport::Subscriber sub = it.subscribe("/pg_15508342/image_raw", 1, imageCallback);


 ros::spin();
return 0;

然而,当我运行我的代码时,我收到了Segmentation fault (core dumped).... 可能是什么问题?代码在image_transport::ImageTransport it(nodea); 处崩溃

请注意,我可以使用命令行运行 image_transport:rosrun image_transport republish raw in:=/pg_15508342/image_raw raw out:=/newim。也可以运行image_view

【问题讨论】:

【参考方案1】:

我想我现在可以看到问题的根源了。它与从外部 ros 包含的 Boost 有关。 事实上,我应该在问题中报告我的完整 CMakeLists.txt,但我最初并没有想到这个问题与任何相关程度......

在我的 CMakeLists.txt 中,我加入了我自己的 boost(从源代码下载的最新版本),例如

SET (BOOST_DIR "/home/polar/soft/lib/boost/boost_1_61_0")
SET (BOOST_INCLUDEDIR "/home/polar/soft/lib/boost/boost_1_61_0/build/include")
SET (BOOST_LIBRARYDIR "/home/polar/soft/lib/boost/boost_1_61_0/build/lib")

FIND_PACKAGE(Boost 1.61.0 REQUIRED thread)
if (NOT Boost_FOUND)
  message(FATAL_ERROR " Fatal error: Boost (version >= 1.55) required.")
else()
  message(STATUS "Setting up BOOST")
  message(STATUS " Includes - $Boost_INCLUDE_DIRS")
  message(STATUS " Library  - $Boost_LIBRARY_DIRS")
  include_directories($Boost_INCLUDE_DIRS)
  link_directories($Boost_LIBRARY_DIRS)
endif (NOT Boost_FOUND)

因此,我在image_transport::ImageTransport it(nh); 遇到了分段错误。但是,将上面的 CMake 代码替换为仅

FIND_PACKAGE(Boost)

我不再有分段错误。我应该更多地关注 ros 给出的关于 ROS 的 Boost 和我的独立 Boost 之间最终冲突的警告信息......

那么还有一个问题,如何将独立的Boost与ROS catkin一起使用??

【讨论】:

以上是关于无法从 cpp 代码运行 image_transport:“分段错误(核心转储)”的主要内容,如果未能解决你的问题,请参考以下文章

Python脚本无法从Qt完全运行

无法从 main.cpp 中的共享库中捕获异常

无法编译 rtmidi 测试 cmidiin.cpp 文件,非法指令

如何运行visual c++下多个cpp文件,就是在同一个项目下建立了多个.cpp源文件,但是无法生成,运行第二个

通过 Python 代码从 Windows 运行命令

CPP - 将源代码从 Windows 转换为 Linux [关闭]