今天动手运行了高翔《视觉SLAM十四讲》第3讲“三维空间刚体运动”中的代码部分,前面的部分非常顺利,但是到了3.7节可视化演示的部分,出现了非常棘手的问题,大约画了3个小时的时间才解决。趁热乎记录一下,并且把最终实现的代码贴在本博客中,以便于后面踩坑的时候能及时解决。
坑1:undefined reference to symbol
最主要的坑就是标题所示的那个:
undefined reference to symbol ‘glTexImage2D‘
完整的报错类似:
undefined reference to symbol 'glTexImage2D'
error adding symbols: DSO missing from
搜了一下原因,这篇博客写的比较清楚。最终,我采用了他所说的“可能是因为make编译未找到链接的共享库 LibGL.so文件 ,我们可以在CMakeLists.txt文件中的 target_link_libraries 语句中添加 LibGL.so”这个方法,事实证明是很管用的。具体来说,就是在CMakeLists.txt中添加这一句话:
target_link_libraries(plotTrajectory GL)
坑2:findPackage没有找到package
可能是因为路径的问题,源代码中的findpackage没有找到pangolin的头文件和库文件,于是会报类似下的错误:
undefined reference to 'panbolin'::CreateWindowAndBind(std...........blabla)
这显然是引用失败,我自己写了findPangolin.cmake文件(详情见下方),并且按照截图的方式组织的工程结构如下。
./cmake/FindPangolin.cmake
find_path(PANGOLIN_INCLUDE_DIR
NAMES pangolin.h
PATHS "/usr/local/include/pangolin/"
)
find_library(PANGOLIN_LIBRARY
NAMES pangolin
PATHS "/usr/local/lib/"
)
MESSAGE("THIS IS A DEBUG INFO.")
MESSAGE("${PANGOLIN_INCLUDE_DIR}")
MESSAGE("${PANGOLIN_LIBRARY}")
IF (PANGOLIN_INCLUDE_DIR AND PANGOLIN_LIBRARY)
SET(PANGOLIN_FOUND TRUE)
MESSAGE("PANGOLIN FOUND = TRUE")
ENDIF (PANGOLIN_INCLUDE_DIR AND PANGOLIN_LIBRARY)
IF (PANGOLIN_FOUND)
IF(NOT PANGOLIN_FIND_QUIETLY)
MESSAGE(STATUS "FOUND PANGOLIN_LIB:${PANGOLIN_LIBRARY}")
ENDIF(NOT PANGOLIN_FIND_QUIETLY)
ELSE (PANGOLIN_FOUND)
IF(PANGOLIN_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "COULD NOT FIND PANGOLIN LIBRARY.")
ENDIF(PANGOLIN_FIND_REQUIRED)
ENDIF(PANGOLIN_FOUND)
./CMakeLists.txt
cmake_minimum_required( VERSION 2.8 )
set( CMAKE_BUILD_TYPE "Debug")
project(plotTrajectory)
set(CMAKE_MODULE_PATH ~/slam/examplesInTheBook/Chapter3/plotTrajectory/cmake)
MESSAGE("IWUCH DEBUG PROJECT_MODULE_PATH:${CMAKE_MODULE_PATH}")
find_package(Pangolin REQUIRED)
if(PANGOLIN_FOUND)
include_directories(${
PANGOLIN_INCLUDE_DIR})
add_executable(plotTrajectory plotTrajectory.cpp