C++ 和 Ubuntu 学习过程中遇到的一些问题及解决方案

本文环境:

Ubuntu: 22.04
OpenCV: 3.4.16
Pangolin: 0.9.1
Eigen3: 3.4.0

shared_ptr找不到

报错信息:

simpleViewer.h:238:8: error: ‘shared_ptr’ in namespace ‘std’ does not name a template type
  238 |   std::shared_ptr<std::thread> th_run_;
      |        ^~~~~~~~~~

解决方法:在头文件中添加

#include <memory>

Can’t initialize GTK backend in function ‘cvInitSystem’

报错信息:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.16) /home/xxx/Desktop/opencv-3.4.16/modules/highgui/src/window_gtk.cpp:624: error: (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'

解决方法:我使用的是远程连接ubuntu运行,在虚拟机内直接运行程序后不报错

OpenCV依赖项,无法定位软件包libjasper-dev

报错信息:

报错

解决方法:

先添加密钥:

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32

再添加软件源:

$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

最后再更新软件源列表,安装:

$ sudo apt update
$ sudo apt install libjasper1 libjasper-dev

用户中文目录修改成英文

问题描述:

有时候安装系统后,用户目录下的文件夹是中文的(比如下载、文档),需要修改为英文

解决方法:

$ export LANG=en_US
$ xdg-user-dirs-gtk-update

在弹出的对话框中选择确定修改
再输入

$ export LANG=zh_CN

就可以了

sudo: updatedb:找不到命令

报错信息:

如标题

解决方法:

$ sudo apt install mlocate
$ sudo updatedb

Ubuntu 24.04后

$ sudo apt install plocate
$ sudo updatedb

安装ORB-SLAM2,以及过程中遇到的问题解决方法

安装过程:

首先安装好OpenCV,Eigen3,本文的安装版本见目录“本文环境”部分

接着来安装Pangolin
首先要安装一些Pangolin所需要的依赖库:

$ sudo apt-get install libglew-dev
$ sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
$ sudo apt-get install libboost-all-dev
$ sudo apt-get install libpython2.7-dev

下载Pangolin,本文编写时最新为0.9.1

$ git clone https://github.com/stevenlovegrove/Pangolin.git

进入Pangolin目录,编译

$ mkdir build
$ cd build
$ cmake ..
$ make -j
$ sudo make install 

安装完Pangolin后,下载ORB SLAM2

$ git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

进入ORB_SLAM2目录下,编译前修改一下ORB_SLAM2文件夹内的内容

Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc 
Examples/Monocular/mono_tum.cc 
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc 
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc 
src/LoopClosing.cc 
src/System.cc 
src/Tracking.cc 
src/Viewer.cc

在这些源文件的头文件处添加头文件

 #include <unistd.h>

然后打开ORB_SLAM2/include/LoopClosing.h

// 找到
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
// 修改为
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;

修改ORB_SLAM2/CMakeLists.txt,修改c++11 为 c++14

# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
   add_definitions(-DCOMPILEDWITHC11)
   message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
   add_definitions(-DCOMPILEDWITHC0X)
   message(STATUS "Using flag -std=c++0x.")
else()
   message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

改为

# Check C++14 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX14)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
   add_definitions(-DCOMPILEDWITHC11)
   message(STATUS "Using flag -std=c++14.")
elseif(COMPILER_SUPPORTS_CXX0X)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
   add_definitions(-DCOMPILEDWITHC0X)
   message(STATUS "Using flag -std=c++0x.")
else()
   message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
endif()

继续修改ORB_SLAM2/CMakeLists.txt

# 找到
find_package(Eigen3 3.1.0 REQUIRED)
# 改为
find_package(Eigen3 3.1.0 REQUIRED NO_MODULE)

最后进行编译

$ ./build.sh

编译成功
在这里插入图片描述

参考文章:

ORB SLAM2 编译报错 /usr/bin/ld:找不到 -lEigen3::Eigen
Ubuntu虚拟机下安装运行ORB-SLAM2
ORB_SLAM安装问题error: ‘std::chrono::monotonic_clock’ has not been declared
ORB_SLAM2项目中的报错及解决方法
ORB_SLAM2编译之Pangolin安装与报错解决

vmware虚拟机升级ubuntu 24.04后,开机黑屏卡死

解决办法:

vmware里面选择虚拟机,编辑虚拟机设置
硬件里面,点击显示器,取消勾选“加速3D图形“
在这里插入图片描述
重新启动发现可用了

升级到Ubuntu 24.04后,Pangolin报错

报错信息1:

升级到Ubuntu 24.04后,尝试用Pangolin运行示例程序发现报错,尝试重新cmake安装,make过程中报错

hm@vm:~/Desktop/Pangolin/examples/HelloPangolin/build$ make
[ 50%] Building CXX object CMakeFiles/HelloPangolin.dir/main.o
[100%] Linking CXX executable HelloPangolin
/usr/bin/ld: warning: libtiff.so.5, needed by /usr/local/lib/libpango_image.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /usr/local/lib/libpango_image.so: undefined reference to `TIFFReadScanline@LIBTIFF_4.0'
/usr/bin/ld: /usr/local/lib/libpango_image.so: undefined reference to `TIFFScanlineSize@LIBTIFF_4.0'
/usr/bin/ld: /usr/local/lib/libpango_image.so: undefined reference to `TIFFSetWarningHandler@LIBTIFF_4.0'
/usr/bin/ld: /usr/local/lib/libpango_image.so: undefined reference to `TIFFClose@LIBTIFF_4.0'
/usr/bin/ld: /usr/local/lib/libpango_image.so: undefined reference to `TIFFGetField@LIBTIFF_4.0'
/usr/bin/ld: /usr/local/lib/libpango_image.so: undefined reference to `TIFFOpen@LIBTIFF_4.0'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/HelloPangolin.dir/build.make:108:HelloPangolin] 错误 1
make[1]: *** [CMakeFiles/Makefile2:83:CMakeFiles/HelloPangolin.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

解决方法:

libtiff官网 下载对应的安装包 tiff-4.0.10.zip,解压之后,然后编译安装:

$ cd tiff-4.0.10/
$ mkdir cmake-build
$ cd cmake-build/
$ cmake ..
$ make
$ sudo make install

重新make发现可用了

报错信息2:

尝试运行刚刚编译好的HelloPangolin报错,找不到libtiff.so.5这个库

hm@vm:~/Desktop/Pangolin/examples/HelloPangolin/build$ ./HelloPangolin 
./HelloPangolin: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory

解决方法:

首先输入下面命令查询当前动态库版本,根据找不到的动态库名自行更改。

$ ls /lib/x86_64-linux-gnu/libtiff.so.*
# 运行结果
/lib/x86_64-linux-gnu/libtiff.so.6  /lib/x86_64-linux-gnu/libtiff.so.6.0.1

可以看到我们 Ubuntu 24.04 的系统上只有 6 这个版本,我们设置一个 5 到 6 的软连接即可。

$ sudo ln -s /lib/x86_64-linux-gnu/libtiff.so.6 /lib/x86_64-linux-gnu/libtiff.so.5

重新运行成功
在这里插入图片描述

参考文章:

编译报错:undefined reference to `TIFFReadDirectory@LIBTIFF_4.0‘解决方法
【BUG解决】PyTorch ImportError: libtinfo.so.5: cannot open shared object file: No such file or directory

ORB-SLAM2运行数据集显示“已放弃(核心已转储)”

解决方法:

在 ORB_SLAM2/CMakeLists.txt 中删除 -march=native

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

在 ORB_SLAM2/Thirdparty/g2o/CMakeLists.txt中删除-march=native

# Compiler specific options for gcc
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") 
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native")

参考文章:

论ORBSLAM_with_pointcloud_map段错误(核心已转储)的另一种解决方法

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值