Ubuntu 22.04下Pangolin库安装指南:依赖配置与编译报错排查

发布时间:2026/9/17 15:16:07
Ubuntu 22.04下Pangolin库安装指南:依赖配置与编译报错排查 1. 写在前面为什么要折腾Pangolin做视觉SLAM、三维重建或者机器人感知的同学对Pangolin应该都不陌生。它是一个基于OpenGL的轻量级可视化库专门用来做3D视图交互和显示ORB-SLAM系列、OpenMVG这些经典项目都拿它当默认的可视化组件。但Pangolin的安装有个很“经典”的问题太老了。它最后一次正式更新停留在几年前对新的Ubuntu版本、新的编译器、新的OpenGL环境兼容性并不好。我在Ubuntu22.04上装它的时候就踩了不少坑网上的教程大多停留在Ubuntu16.04、18.04时代照着抄大概率编译报错。这篇文章就围绕“Ubuntu22.04下Pangolin库的安装”这个主题把从依赖准备、源码编译、到常见报错处理的全过程梳理一遍。不管你是刚接触SLAM的学生还是要在新环境里跑旧项目的工程师照着这份流程走基本能一次装通。2. 安装前的准备工作2.1 确认系统环境和基础工具链在动手之前先确认几个前提条件。我这边实测的环境是Ubuntu22.04.3 LTS内核版本6.2系列GCC版本11.4.0CMake版本3.22.1。这些版本信息直接决定了后面会遇到哪些坑——比如Ubuntu22.04默认的GCC 11对老版本Pangolin的某些C写法会报错而CMake版本太旧又会导致部分依赖检测失败。先跑一下下面的命令记录下自己的环境信息lsb_release -a gcc --version cmake --version如果你是一台全新的Ubuntu22.04建议先把系统更新到最新避免某些库版本过旧导致的问题sudo apt update sudo apt upgrade -y2.2 Pangolin的依赖到底有哪些Pangolin的依赖可以分为三块基础图形库、窗口管理库、可选扩展库。我在第一次安装时漏了其中的几个导致编译过程反复中断。基础依赖部分最核心的就是OpenGL相关的开发库。Ubuntu22.04自带的Mesa驱动已经能很好地支持OpenGL不需要额外折腾显卡驱动。以下是必装的包sudo apt install -y libgl1-mesa-dev libglew-dev libglfw3-dev libglm-dev这里解释一下每个包的作用libgl1-mesa-devOpenGL开发头文件和链接库Pangolin所有渲染功能的基础。libglew-devGLEWOpenGL Extension Wrangler Library用于管理OpenGL扩展函数Pangolin的旧版本特别依赖它。libglfw3-devGLFW窗口管理库Pangolin的窗口创建和事件处理都靠它。libglm-devGLM数学库OpenGL开发常用的矩阵向量运算库Pangolin内部会用到。接下来是基础工具链和构建工具sudo apt install -y build-essential cmake pkg-config如果你后面要编译ORB-SLAM这类项目建议顺手把Eigen3也装上虽然Pangolin本身不强制要求但很多关联项目会用到sudo apt install -y libeigen3-dev最后是可选依赖。Pangolin支持通过FFmpeg读写视频、通过libpng保存截图、通过OpenNI接入深度相机。如果你只用它做普通的3D显示这些可以不装但如果要做数据集录制或深度图可视化建议还是装上sudo apt install -y libpng-dev libjpeg-dev libtiff-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev2.3 源码获取方式选择Pangolin的官方仓库在GitHub上有两个获取方式。第一种是直接克隆最新代码git clone --recursive https://github.com/stevenlovegrove/Pangolin.git第二种是切换到稳定版本分支。如果你是要编译ORB-SLAM2、ORB-SLAM3这类老项目建议直接checkout到v0.6版本这个版本和ORB-SLAM系列的兼容性最好git clone --recursive https://github.com/stevenlovegrove/Pangolin.git cd Pangolin git checkout v0.6我个人的经验是如果只是学习Pangolin本身用最新代码问题不大如果要配合SLAM项目使用务必使用v0.6版本。原因是ORB-SLAM系列在CMakeLists里会对Pangolin的版本做检测新版Pangolin的接口变化可能导致编译链接阶段报错。3. 核心环节编译与安装过程全记录3.1 CMake配置阶段的参数选择进入Pangolin源码目录后先创建build目录然后运行CMake进行配置cd Pangolin mkdir build cd build cmake ..这里要说一个很多人容易忽略的点CMake配置输出信息里有大量“Found”和“Not Found”的提示务必要仔细看。特别是下面几个关键检测项Found OpenGL确认OpenGL开发环境是否正常。Found GLEWGLEW库是否被正确找到。Found GLFWGLFW窗口库是否可用。Found PNG / JPEG图片读写支持是否开启。Found FFMPEG视频读写支持是否开启。我遇到过一次情况是系统里装了GLFW但版本太旧CMake直接跳过了GLFW检测导致后续编译时窗口相关功能全部失效。所以在配置阶段花一分钟检查这些输出能省下后面半天排错时间。如果你不需要某些可选功能可以在CMake时显式关闭加快编译速度cmake .. -DBUILD_EXAMPLESOFF -DBUILD_PANGOLIN_LSMOFF -DBUILD_PANGOLIN_VIDEOOFF这几个开关的含义BUILD_EXAMPLES是否编译示例程序建议第一次安装时打开方便测试。BUILD_PANGOLIN_LSMLSMLightweight Session Manager组件用不到就关掉。BUILD_PANGOLIN_VIDEO视频输入模块不处理视频流就关掉。3.2 正式编译时的资源分配与时间预期配置完成后开始编译。这里要特别强调并行编译参数的选择。很多教程直接让你用make -j4或者make -j8但在虚拟机环境或内存较小的机器上过高的并行数会导致编译中途被系统杀死。我实测下来在8核16线程的物理机上make -j8大概需要3到5分钟在4核8线程的虚拟机上make -j4需要10分钟左右。建议先用下面的命令查看CPU核心数再决定并行参数nproc然后按核数的一半设置并行度make -j$(nproc)如果编译过程中出现“killed”或者“internal compiler error”这类提示多半是因为内存不足或并行度过高。这种情况最简单的处理方式是降低并行度make -j23.3 安装与验证编译完成后执行安装命令sudo make install安装完成后需要刷新动态链接库缓存sudo ldconfig这一步很关键很多同学编译完直接运行程序结果提示找不到libpango.so就是因为没有刷新缓存。验证安装是否成功有两个简单方法。第一个是运行自带的测试程序cd /usr/local/bin ./SimpleRepeat如果能看到一个旋转的彩色3D立方体窗口说明Pangolin的核心功能正常。第二个方法是写一个最简单的CMake项目来测试链接。创建一个测试目录新建CMakeLists.txtcmake_minimum_required(VERSION 3.10) project(PangolinTest) find_package(Pangolin REQUIRED) add_executable(test main.cpp) target_link_libraries(test ${Pangolin_LIBRARIES})main.cpp内容#include pangolin/pangolin.h int main() { pangolin::CreateWindowAndBind(Test, 640, 480); return 0; }依次执行mkdir build cd build cmake .. make ./test能正常创建窗口即可。4. 常见编译报错与排查实录4.1 典型的C11标准编译报错这是Ubuntu22.04上最常遇到的问题。GCC 11默认的C标准是C17而Pangolin的老版本代码里有些写法在新标准下不被允许导致编译报错。典型的错误信息长这样error: ‘numeric_limits’ is not a member of ‘std’ error: ‘max’ is not a member of ‘std’或者error: ‘decay_t’ is not a member of ‘std’这类问题的本质是头文件引用缺失或标准库版本不匹配。老版本Pangolin的某些头文件依赖了旧版GCC的隐式包含在GCC 11下这些隐式包含被移除了。解决方案有三个按推荐程度排序第一给CMake编译参数加上-stdc11强制使用C11标准cmake .. -DCMAKE_CXX_STANDARD11第二如果方法一无效可以在Pangolin的CMakeLists.txt文件里找到set(CMAKE_CXX_STANDARD相关的行手动修改为11。第三直接使用最新版源码。最新版Pangolin已经适配了C17如果你不需要兼容老项目用最新的就行。4.2 GLFW相关的链接错误链接阶段如果报这样的错误undefined reference to glfwGetError undefined reference to glfwInit说明GLFW开发库没有装或者版本不对。检查一下有没有安装libglfw3-devdpkg -l | grep glfw如果没有输出重新安装sudo apt install -y libglfw3-dev如果已经安装了但还是报错大概率是CMake缓存的问题。删除build目录重新配置cd Pangolin rm -rf build mkdir build cd build cmake ..4.3 OpenGL头文件找不到的问题报错信息一般是fatal error: GL/gl.h: No such file or directory这是因为缺少OpenGL开发头文件。在Ubuntu22.04上需要安装mesa的开发库sudo apt install -y libgl1-mesa-dev如果还不行再补装一个libglu1-mesa-devsudo apt install -y libglu1-mesa-dev4.4 编译时提示找不到libpng.so这个问题在64位系统上比较特殊。报错信息一般是error while loading shared libraries: libpng16.so.16: cannot open shared object file或者是CMake阶段直接提示找不到libpng。处理方法是安装libpng的32位兼容版本sudo apt install -y libpng-dev sudo dpkg --add-architecture i386 sudo apt update sudo apt install -y libpng-dev:i386但注意如果你是在纯64位环境下编译没必要装i386版本只要保证libpng-dev已安装就行。4.5 编译Golden Retriever示例时报错如果你在编译示例程序时遇到类似这样的错误error: ‘Grey’ is not a member of ‘cv’这是因为示例程序用到了OpenCV相关的颜色常量但Ubuntu22.04上安装的OpenCV是4.x版本而Pangolin示例是按OpenCV 3.x写的。解决方案是安装OpenCV开发库或者在编译时关闭示例程序cmake .. -DBUILD_EXAMPLESOFF如果不是对示例有强需求我建议直接关掉能省不少编译时间。4.6 安装版vs源码编译版的冲突问题还有一个比较隐蔽的问题有些同学在系统里通过apt安装过一个旧版本的Pangolin然后又手动编译了新版。这时候find_package会优先找到系统路径下apt安装的那份导致头文件和库文件版本不一致。排查方法dpkg -l | grep pangolin ldconfig -p | grep pango如果发现有系统安装的版本建议先卸载sudo apt remove -y libpangolin-dev然后再重新编译安装源码版本。5. 安装完成后的配置与使用建议5.1 环境变量的正确设置Pangolin安装后头文件位于/usr/local/include/pangolin库文件位于/usr/local/lib。一般情况下/usr/local/lib已经在系统的默认搜索路径中但如果你的系统里没有需要手动添加。编辑~/.bashrcexport LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH然后执行source ~/.bashrc5.2 配合CLion或VSCode的开发环境配置如果你用CLion开发需要在CMakeLists.txt里确保能找到Pangolinfind_package(Pangolin REQUIRED) include_directories(${Pangolin_INCLUDE_DIRS})用VSCode写代码的话编辑.vscode/c_cpp_properties.json在includePath里加上/usr/local/include/pangolin这样代码跳转和智能提示都能正常工作。5.3 与ORB-SLAM系列项目的兼容性建议最后分享一个实测经验。如果你是为了跑ORB-SLAM2或者ORB-SLAM3才装的Pangolin务必注意以下几点第一ORB-SLAM2的CMakeLists.txt里写死了Pangolin的查找路径如果你不是默认安装到/usr/local需要手动修改ORB-SLAM2的CMakeLists.txt。第二ORB-SLAM3对Pangolin的版本有要求v0.6版本最稳妥。新版Pangolin虽然能编译通过但在运行时Viewer模块可能因为接口变化出现窗口异常。第三如果ORB-SLAM编译时提示Pangolin版本过旧可以临时修改ORB-SLAM的CMakeLists.txt把版本检测注释掉但不建议长期这样用可能埋下运行时隐患。我自己的环境里Ubuntu22.04 Pangolin v0.6 ORB-SLAM3这个组合已经跑了半年多无论是EuRoC数据集还是自己录的相机数据可视化部分都很稳定。希望这篇文章能帮你少走一些弯路在新系统上顺利把Pangolin跑起来。