这篇文章主要是汇总我在编译ROS文件中常遇到的警告和错误,并且会不定时更新。
这种警告主要是在定义的时候,或者声明的时候与之前定义的顺序不一致,只需要将其顺序调整为一致的即可。
2. passing 'const xxx ' as 'this' argument discards qualifiers [-fpermissive] 错误
主要是由于错误使用了const标记符,尤其是对于会被修改的变量,使用const使其不会被修改
3. error: no matching function for call to ‘ratslam::LocalViewMatch::on_image(const value_type*, bool, const _width_type&, const _height_type&, cv_bridge::CvImageConstPtr&, OrbVocabulary&, OrbLoopDetector&, DLoopDetector::TemplatedLoopDetector
" ? false : true), image->width, image->height, cv_ptr, voc, detector, params);
这个主要原因是没有找到对应匹配的函数,可能是由于修改了头没顾上尾,需要返回寻找定义,进行一下修改。
4. In file included from /home/edward/catkin_ws/src/ratslam_ros/src/ratslam/local_view_match.cpp:29:0:
/home/edward/catkin_ws/src/ratslam_ros/src/ratslam/local_view_match.h:44:10: fatal error: DUtils.h: 没有那个文件或目录
#include "DUtils.h"
^~~~~~~~~~
compilation terminated.
ratslam_ros/CMakeFiles/ratslam.dir/build.make:110: recipe for target 'ratslam_ros/CMakeFiles/ratslam.dir/src/ratslam/local_view_match.cpp.o' failed
make[2]: *** [ratslam_ros/CMakeFiles/ratslam.dir/src/ratslam/local_view_match.cpp.o] Error 1
CMakeFiles/Makefile2:2877: recipe for target 'ratslam_ros/CMakeFiles/ratslam.dir/all' failed
make[1]: *** [ratslam_ros/CMakeFiles/ratslam.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j1 -l1" failed
这种问题很奇怪,因为,我在build中进行make的时候并未出现关于include头文件的报错问题,但是在catkin中出现了,而且,在我build的文件夹下也可以寻找到相应的头文件。于是我百思不得其解,一整天在搜索make和catkinmake两个的区别,同时在微信群中向一些大佬请教,寻找答案,通过大佬解答发现其实两个make(即,catkinmake和cmake所调用的make文件其实是同一个cmakelists,只不过一个是常见gnuC下面,一个是ROS环境下的,大佬的意思差不多是这个)。但还是没有解决我这个问题的思路,于是群里有大佬建议直接使用绝对路径的方法在程序中进行修改,但在我看来,这是最愚蠢的办法,实在不行再这么做。于是,我又坚持了一个上午,还是没有任何头绪,尝试了若干种别的解决方案之后,我下定决心重头把原始的cmakelists进行修改(主要原来的实在太乱,两个交叉在一起,很难看懂,容易看懵),我按照另外一种格式重新写了一下cmakelists,终于在千难万险之下,把其中的bug找出来了。
主要原因是缺少了这句话target_include_directories(ratslam_em PUBLIC ${DLib_INCLUDE_DIRS} ${DBoW2_INCLUDE_DIRS})
最后结果100%编译通过。
这个bug的解决过程并不顺利,但我忽然想起翁恺老师在C语言程序设计课所讲过的一句话:学计算机一定要有一个非常强大的心理状态,什么呢,计算机的所有东西都是人做出来的,别人能想出来的我也一定想得出来,在计算机里头没有任何黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把它里面的细节搞明白的!
加油!COME ON!