Pangolin 是一個可用於SLAM可視化的openGL庫。目前有很多SLAM系統都用它作為可視化的工具。它的編譯與安裝過程問題不大,依賴也比較少。但最近我在單獨使用它的時候,碰到了很奇怪的現象:我單獨將HelloPangolin這個example以及它的CMakelists.txt取出來,通過cmake,build的方式去編譯,報了一堆錯:
In file included from /home/lenovo/Pangolin/include/pangolin/var/var.h:34:0, from /home/lenovo/Pangolin/include/pangolin/var/varextra.h:31, from /home/lenovo/Pangolin/include/pangolin/pangolin.h:52, from /home/lenovo/expangolin/main.cpp:1: /home/lenovo/Pangolin/include/pangolin/var/varvalue.h: In instantiation of ‘void pangolin::VarValue::Init() [with T = bool]’: /home/lenovo/Pangolin/include/pangolin/var/varvalue.h:55:14: required from ‘pangolin::VarValue::VarValue(const T&) [with T = bool]’ /home/lenovo/Pangolin/include/pangolin/var/var.h:170:20: required from ‘pangolin::Var::Var(const string&, const T&, bool) [with T = bool; std::string = std::basic_string]’ /home/lenovo/Pangolin/include/pangolin/var/varextra.h:67:52: required from here /home/lenovo/Pangolin/include/pangolin/var/varvalue.h:99:23: error: ‘class pangolin::VarValue’ has no member named ‘str’ this->str = (VarValueTstd::string*)this; ^ /home/lenovo/Pangolin/include/pangolin/var/varvalue.h:102:23: error: ‘class pangolin::VarValue’ has no member named ‘str’ this->str = str_ptr;
出現這種錯誤,意味着Pangolin庫的路徑是能夠被找到的,但通過這個庫編譯example的時候,出現了問題。這個問題困擾了很久,最終我通過對比ORB-SLAM2中的CMakeLists.txt才發現,需要通過CMake加上C++11 或者C++0x的support,最終編譯pangolin的example的CMakeLists.txt 如下:

cmake_minimum_required(VERSION 2.8) project(HelloPangolin) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native") # 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() find_package(Pangolin REQUIRED) include_directories(${Pangolin_INCLUDE_DIRS}) # Build examples add_executable(test main.cpp) target_link_libraries(test ${Pangolin_LIBRARIES})