g2o学习记录(6)旧版本g2o的g2o_viewer在ubuntu16.04的运行报错解决

旧版本g2o的问题

  最近使用g2o_viewer查看g2o的文件的时候会报错。
  报错的问题输出如下:

*** Error in `g2o_viewer': realloc(): invalid pointer: 0x00007f2d983e5820 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f2d98c4b7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x85d80)[0x7f2d98c59d80]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x22f)[0x7f2d98c588ef]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(_ZN9QListData7reallocEi+0x1f)[0x7f2d9430d9cf]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(_ZN9QListData6appendEi+0x81)[0x7f2d9430daa1]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(+0x1d6d78)[0x7f2d943d9d78]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(_Z21qRegisterResourceDataiPKhS0_S0_+0x2e6)[0x7f2d943d5b16]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(+0x7bcc3)[0x7f2d9427ecc3]
/lib64/ld-linux-x86-64.so.2(+0x106ba)[0x7f2d9aaf06ba]
/lib64/ld-linux-x86-64.so.2(+0x107cb)[0x7f2d9aaf07cb]
/lib64/ld-linux-x86-64.so.2(+0xc6a)[0x7f2d9aae0c6a]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:07 469237                             /usr/local/bin/g2o_viewer
.....

问题的探查原因

  当查看这里的时候,你会发现有问题!

/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(_ZN9QListData7reallocEi+0x1f)[0x7f2d9430d9cf]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(_ZN9QListData6appendEi+0x81)[0x7f2d9430daa1]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(+0x1d6d78)[0x7f2d943d9d78]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(_Z21qRegisterResourceDataiPKhS0_S0_+0x2e6)[0x7f2d943d5b16]
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5(+0x7bcc3)[0x7f2d9427ecc3]

处理和解决

  其实大部分是由于依赖的问题,旧版本的g2o大概在2011-2012年之间的时候,这时候ubuntu16.04还没出来,目前我在ubuntu16.04下使用的g2o因为我安装的是qt5的环境,而按理来说,应该是qt4的,不过我目前还是喜欢qt5的。所以我安装一下下面的依赖项。

sudo apt-get install libqglviewer-dev

  然后删除qt4-qmake等之类(虽然我没安装,但是你困难需要卸载),然后安装qt5

sudo apt-get remove qt4-qmake # 举个例子的删除qt4-qmake
sudo apt-get install qt5-default qtcreator

  接下来重新编译g2o,但是你会发现,无法链接。

  这说明找不到xxx的话,需要修改一下g2o的cmake_modules的FindQGLViewer.cmake文件。

  把原本的这个地方

find_library(QGLVIEWER_LIBRARY_RELEASE
  NAMES qglviewer-qt4 qglviewer QGLViewer QGLViewer2
  PATHS /usr/lib
        /usr/local/lib
        /opt/local/lib
        /sw/lib
        ENV QGLVIEWERROOT
        ENV LD_LIBRARY_PATH
        ENV LIBRARY_PATH
  PATH_SUFFIXES QGLViewer QGLViewer/release
)
find_library(QGLVIEWER_LIBRARY_DEBUG
  NAMES dqglviewer dQGLViewer dQGLViewer2 QGLViewerd2
  PATHS /usr/lib
        /usr/local/lib
        /opt/local/lib
        /sw/lib
        ENV QGLVIEWERROOT
        ENV LD_LIBRARY_PATH
        ENV LIBRARY_PATH
  PATH_SUFFIXES QGLViewer QGLViewer/release
)

  修改如下所示,主要是NAMES这里改了:

find_library(QGLVIEWER_LIBRARY_RELEASE
  NAMES qglviewer QGLViewer qglviewer-qt5 QGLViewer-qt5
  PATHS /usr/lib
        /usr/local/lib
        /opt/local/lib
        /sw/lib
        ENV QGLVIEWERROOT
        ENV LD_LIBRARY_PATH
        ENV LIBRARY_PATH
  PATH_SUFFIXES QGLViewer QGLViewer/release
)
find_library(QGLVIEWER_LIBRARY_DEBUG
  NAMES dqglviewer dQGLViewer dqglviewer-qt5 dQGLViewer-qt5 QGLViewerd2
  PATHS /usr/lib
        /usr/local/lib
        /opt/local/lib
        /sw/lib
        ENV QGLVIEWERROOT
        ENV LD_LIBRARY_PATH
        ENV LIBRARY_PATH
  PATH_SUFFIXES QGLViewer QGLViewer/release
)

  接着删除原本安装的g2o。

sudo rm -rf /usr/local/include/g2o
# 删除g2o共享库
cd /usr/local/lib
sudo rm -rf libg2o_*.so
find /usr/local/lib -name "*libg2o*.so" -type f # 查看是否删除干净

  再回去g2o的build目录下继续cmake和make和make install。

  你会发现一切都OK(如果有报错,建议重新编译还没变动的旧版本g2o)。

  接下来再使用g2o_viewer就不会有问题了。

发布了189 篇原创文章 · 获赞 675 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/YuYunTan/article/details/85624818
g2o