当前位置:   article > 正文

error: invalid use of incomplete type ‘class Ogre::SceneManager’问题修改

invalid use of incomplete type

1.问题描述

自己开发的程序中使用到了jsk_rviz_plugins这个包,之前使用的是Nvidia的PX2板子,系统环境是Ubuntu16.04+ROS kinetic,编译运行没有问题。最近开发板子升级到Nvidia Xavier之后,系统环境也升级为Ubuntu18.04+ROS melodic,结果编译程序的时候遇到如下问题:

/home/nvidia/workspace/autonomousDriving_Xavier/src/utils/jsk_rviz_plugins/src/bounding_box_display.cpp: In member function ‘virtual void jsk_rviz_plugins::BoundingBoxDisplay::onInitialize()’:
/home/nvidia/workspace/autonomousDriving_Xavier/src/utils/jsk_rviz_plugins/src/bounding_box_display.cpp:86:33: error: invalid use of incomplete type ‘class Ogre::SceneManager’
     scene_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode();
                                                      ^~
In file included from /usr/include/OGRE/OgreColourValue.h:31:0,
                 from /opt/ros/melodic/include/rviz/properties/parse_color.h:35,
                 from /opt/ros/melodic/include/rviz/properties/color_property.h:34,
                 from /home/nvidia/workspace/autonomousDriving_Xavier/src/utils/jsk_rviz_plugins/src/bounding_box_display_common.h:42,
                 from /home/nvidia/workspace/autonomousDriving_Xavier/src/utils/jsk_rviz_plugins/src/bounding_box_display.cpp:35:
/usr/include/OGRE/OgrePrerequisites.h:254:11: note: forward declaration of ‘class Ogre::SceneManager’
     class SceneManager;
           ^~~~~~~~~~~~
utils/jsk_rviz_plugins/CMakeFiles/jsk_rviz_plugins.dir/build.make:210: recipe for target 'utils/jsk_rviz_plugins/CMakeFiles/jsk_rviz_plugins.dir/src/bounding_box_display.cpp.o' failed
make[2]: *** [utils/jsk_rviz_plugins/CMakeFiles/jsk_rviz_plugins.dir/src/bounding_box_display.cpp.o] Error 1
CMakeFiles/Makefile2:8666: recipe for target 'utils/jsk_rviz_plugins/CMakeFiles/jsk_rviz_plugins.dir/all' failed
make[1]: *** [utils/jsk_rviz_plugins/CMakeFiles/jsk_rviz_plugins.dir/all] Error 2

Makefile:140: recipe for target 'all' failed

2.问题修复方法

从问题日志error: invalid use of incomplete type ‘class Ogre::SceneManager’来看,应该是代码中找不到这个对象的定义,所以会出现类型不兼容的问题。那么,只要在出问题的地方把定义Ogre::SceneManager的头文件进行引用就可以了。但是,修改起来没那么简单,因为Ogre::SceneManager类型是在其他头文件中添加的,然后在报错的地方加入的其他头文件。

所以,遇到这种第三方库编译问题的话,最好网上先找找,别人肯定也会遇到,终于找到了该问题的解决方案:

问题修复的链接如下:https://github.com/jsk-ros-pkg/jsk_visualization/pull/765/commits/60bdfd7a3d11af8fa82f02a302b362fbd2f580ea

在此也贴一下问题修复的代码。

这里一共修改了6个文件,修改方法也就是将对应的头文件添加到其使用的头文件中。可以看到,在出问题的文件bounding_box_display.cpp中引用了bounding_box_display_common.h这个头文件,因为在bounding_box_display_common.h这个头文件中引入了Ogre::SceneManager这个类的定义,所以编译问题修复了。

修改后再次运行,果然解决了该编译问题。完美。

3.一点总结

一般在自己程序中使用到的第三方库或者程序的时候,如果编译或者运行出错的话,在自己看不出问题所在的情况下,一定要网上找找。个人感觉百度搜索没有Google查找的资料全面,尤其是一些第三方的开源库,在找不到的情况下记得去github上找找,兴许就可以找到。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/121160
推荐阅读
相关标签
  

闽ICP备14008679号