ubuntu14.04虚拟机上编译Opencv3.4.9遇到的一些莫名其妙的编译错误

记录一下漫漫编译之路的绊脚石

错误1:编译过程中出现一个 internal compiler error: 段错误 const T22 v22_;
解决方案:更新g–和g++版本!!本来是4.8.4更新到5.5就没有这个错误了,我也不知道我为什么要更新这个,找了很多地方都没找到解决方案,就试着升级了一下,竟然没报错了。后面还遇到了一些类似的段定义错误,就顺手升级了一下cmake,本来是2.8好像,升级到了3.11.3。

错误2/usr/include/c++/5/bits/stl_multimap.h:557:23: internal compiler error: 段错误 insert(iterator __position,const value_type& __x)
配图:
ubuntu14.04虚拟机上编译Opencv3.4.9遇到的一些莫名其妙的编译错误_第1张图片
解决方案:在 /usr/include/c++/5/bits/stl_multimap.h 这个头文件中 修改所有的__position为position 修改所有的__x为x

错误3fatal error: opencv2/xfeatures2d/cuda.hpp: 没有那个文件或目录
配图:
ubuntu14.04虚拟机上编译Opencv3.4.9遇到的一些莫名其妙的编译错误_第2张图片
解决方案
① 在/path_to_your_opencv/opencv-3.4.9/modules/stitching/include 目录下的CMakeLists.txt中的顶部加入INCLUDE_DIRECTORIES("/path_to_your_opencv/opencv-3.4.9/opencv_contrib-3.4.9/modules/xfeatures2d/include")
因为我就是在这个目录下找到cuda.hpp文件的。
② 另外在后面再次出现了该错误,找到出现错误的文件,我的出错位置在:/home/stt/me/opencv-3.4.9/modules/stitching/include/opencv2/stitching/detail/matchers.hpp
在文件中把头部的 #include "opencv2/xfeatures2d/cuda.hpp" 改为绝对路径:

#include "/path_to_your_opencv/opencv-3.4.9/opencv_contrib-3.4.9/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp" 

例如,在我自己的目录下这样写:
ubuntu14.04虚拟机上编译Opencv3.4.9遇到的一些莫名其妙的编译错误_第3张图片

再记录一下在编译Pangolin和ORB_SLAM2中遇到的问题:
在编译时看到过程中出现了好多类似于图中这种 什么什么warning,还有c++/5/backward/binders.h **note** declares here 这种note提示,看着很烦。ubuntu14.04虚拟机上编译Opencv3.4.9遇到的一些莫名其妙的编译错误_第4张图片
在两个地方做了改动就没问题了
解决方案
① 回退到自己的根目录然后 sudo gedit ~/.bashrc
在文档最后加入

#using c++11
alias g++='g++-5.5 -std=c++11 -Wno-psabi'

加入这个-std=c++11是为了使用c++11来编译,这是我另一个错误加上的,这里主要是用到-Wno-psabi
② 在ORB_SLAM2文件夹或者Pangolin下的CMakeLists.txt中的顶部加入add_definitions(-w) 因为我编译Pangolin和ORB_SLAM2时都有一大堆warning,所以我两个位置的文档都加了这句话。
大概这样子:
ubuntu14.04虚拟机上编译Opencv3.4.9遇到的一些莫名其妙的编译错误_第5张图片

总结一下:
实验室的服务器只有命令行界面,想跑ORB_SLAM2却显示了图形界面,会报这种错误:

terminate called after throwing an instance of 'std::runtime_error'
what(): Pangolin X11: Failed to open X display

想了好多方法,比如用端口把x11界面转到本地,安装了xshell+xmanager还有putty等等等一系列软件都没能成功地在本地显示界面,遂放弃。
如果是和我一样的朋友,可以把ORB_SLAM2/Examples/Monocular/mono_tum.cc中的这句话中的true改为false:

// Create SLAM system. It initializes all system threads and gets ready to process frames.
    ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,false);

这样就不会去调用线程进行图形化处理啦!改完之后还要重新使用./build.sh编译一下子,这样就只会生成轨迹文档,然后我们想要评估的话就使用evo库的evo_traj 等命令来评估这个轨迹!
弄这个端口转发弄了好久都没成功,真的特别想看到ORB_SLAM2动起来的样子,就想在自己的破烂电脑上安装一个虚拟机来跑,所以就开始陷入漫长的编译之路。
从安虚拟机到编译opencv到编译Pangolin再到编译ORB_SLAM2,遇到了好多好多编译错误,最后总归还是成功了!!!

你可能感兴趣的:(opencv,ubuntu)