Ubuntu 20.04下gtsam的编译与安装:从入门到避坑指南
1. 环境准备打好地基避免后续“楼塌了”如果你刚接触机器人或者视觉SLAM听到gtsam这个名字可能会觉得有点高大上。别慌我刚开始也这样。简单来说你可以把gtsam想象成一个超级厉害的“数学工具箱”。我们在做机器人定位、地图构建或者相机姿态估计时背后有大量复杂的数学计算比如非线性优化、因子图推断。gtsam这个库就是帮我们把学术界那些顶尖的数学理论封装成一个个好用的C类让我们能更专注于算法逻辑本身而不是去从头实现一套优化求解器。在Ubuntu 20.04这个长期支持版本上部署它是一个很常见的需求毕竟很多项目和教程都基于这个稳定的环境。但说实话它的编译安装过程对新手来说坑不算少。今天我就带你走一遍我踩过坑、填过土的路争取让你一次成功。在动手敲任何命令之前花十分钟把环境理顺能省下后面好几个小时的折腾时间。Ubuntu 20.04本身很成熟但它的软件源里的包版本有时会比较“保守”。而gtsam对几个核心依赖的版本又有一定要求这就可能产生冲突。所以第一步不是急着安装而是更新系统并确认基础环境。打开你的终端我们先来一波标准操作sudo apt update sudo apt upgrade这能确保你的系统包列表和已安装的软件都是最新的减少因版本过旧导致的奇怪问题。接下来我们需要安装一些编译代码的“基础设施”比如编译器、构建工具等。这里有个小技巧我习惯一次性把可能需要的开发工具都装上避免来回折腾。sudo apt install build-essential cmake git wget curlbuild-essential包含了gcc、g、make等核心编译工具是编译任何C项目的基石。cmake是gtsam使用的构建系统后面我们全靠它来生成Makefile。git用来下载源码wget和curl是下载其他依赖包时的好帮手。做完这些你的系统就已经具备了基本的代码编译能力。接下来我们要面对gtsam的几个关键依赖Boost、TBB以及可选的MKL。我会在下一节详细拆解它们告诉你哪些是必须的哪些是锦上添花的以及安装时有哪些门道。2. 依赖安装搞定Boost、TBB与可选的MKL依赖库就像是盖房子需要的砖瓦和钢筋没它们主体工程根本没法开工。对于gtsam来说Boost和TBB是必须的“承重墙”而MKL则像是高性能的“特种水泥”用好了能提速但安装稍麻烦且并非在所有情况下都必要。2.1 Boost库功能强大的“瑞士军刀”Boost是一个庞大的C准标准库gtsam用它来处理多线程、文件系统、序列化等很多底层任务。在Ubuntu 20.04上安装Boost比较省心因为官方源里的版本通常是1.71完全满足gtsam的要求1.43。我们直接安装开发版即可sudo apt install libboost-all-dev这条命令会安装Boost的所有模块开发包。虽然会占用几百MB空间但能一劳永逸地避免后续因缺少某个特定Boost组件比如filesystem、system、thread而编译失败。我强烈建议采用这种方式而不是试图只安装最小子集因为新手很难判断gtsam到底用了Boost的哪些部分。2.2 TBB让计算“多线程”飞起来TBB是Intel开发的线程构建块库gtsam用它来管理并行计算充分利用你的多核CPU。安装它同样简单sudo apt install libtbb-dev安装完成后系统会自动配置好头文件和链接库。你可以通过apt policy libtbb-dev查看安装的版本。在后续的CMake配置阶段gtsam会自动去查找这个库。2.3 MKL数学计算的“涡轮增压器”可选这是整个依赖安装里最可能出问题也最让人纠结的部分。MKL是Intel的数学核心函数库提供了高度优化的线性代数、傅里叶变换等数学例程。gtsam如果链接了MKL在一些矩阵运算密集的环节比如求解大型线性方程组可能会有显著的性能提升。但是请注意两个关键点第一MKL并非必需gtsam有自己的内置求解器Eigen不装MKL完全能正常工作第二装了MKL不一定就有提升这取决于你的具体问题规模和硬件。我个人的建议是如果你是第一次安装以跑通和学用gtsam为主可以先跳过MKL等后面有性能瓶颈了再考虑加装。这样可以极大简化安装过程避开很多兼容性问题。如果你确定要安装Intel提供了通过APT仓库安装的方式但步骤稍多。你需要先添加Intel的软件仓库并导入公钥wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | sudo apt-key add - sudo sh -c echo deb https://apt.repos.intel.com/oneapi all main /etc/apt/sources.list.d/oneAPI.list sudo apt update然后你可以安装完整版的MKL或者只安装运行时库。对于编译gtsam我们需要开发包sudo apt install intel-oneapi-mkl-devel安装完成后环境变量通常会自动设置好。你可以通过source /opt/intel/oneapi/setvars.sh来初始化MKL环境建议把这行加到你的~/.bashrc里。记住安装了MKL后在下一步用CMake配置gtsam时记得打开相关的选项否则gtsam不会去链接它。3. 获取源码与CMake配置关键一步定乾坤依赖搞定后我们就可以请出“主角”gtsam了。获取源码最直接的方式就是从官方Git仓库克隆。我推荐在你的家目录下创建一个专门的工作空间比如~/workspace或~/projects这样管理起来比较清晰。cd ~ mkdir -p workspace cd workspace git clone https://github.com/borglab/gtsam.git cd gtsam这里注意原始的Bitbucket仓库bitbucket.org/gtborg/gtsam可能不是最新的GitHub上的borglab/gtsam是更活跃的镜像。克隆完成后别急着编译先看看有什么版本标签是个好习惯git tag。对于生产环境我建议选择一个稳定的发布版本比如4.2a9而不是直接使用develop分支后者虽然功能新但可能不稳定。切换版本命令是git checkout 4.2a9。接下来是最核心的步骤CMake配置。我们需要创建一个独立的build目录来进行“外部构建”这是CMake推荐的最佳实践可以保持源码目录的干净。mkdir build cd build现在执行CMake。这里有几个配置选项直接影响编译结果和后续使用我逐一解释cmake .. -DCMAKE_BUILD_TYPERelease -DGTSAM_BUILD_EXAMPLESOFF -DGTSAM_BUILD_TESTSOFF -DGTSAM_INSTALL_MATLAB_TOOLBOXOFF-DCMAKE_BUILD_TYPERelease这非常重要它告诉编译器进行优化生成性能更高的Release版本程序。如果你设为Debug编译出的库会包含调试信息体积巨大且运行慢只在你需要单步调试gtsam内部代码时才用。-DGTSAM_BUILD_EXAMPLESOFF如果你只是需要使用gtsam库而不是学习它的示例代码可以关掉以加快编译速度。想学习的话可以打开。-DGTSAM_BUILD_TESTSOFF同上关闭单元测试编译。第一次安装建议关闭确保核心库能顺利编过。后续你可以打开它并运行make check来验证安装是否正确。-DGTSAM_INSTALL_MATLAB_TOOLBOXOFF除非你确定需要MATLAB接口否则一定关掉。这个接口的编译依赖MATLAB环境配置起来非常麻烦是常见的失败点。如果你安装了MKL并希望gtsam使用它可以额外添加-DGTSAM_WITH_EIGEN_MKLON。CMake会尝试自动定位MKL。执行完cmake ..命令后请务必花一分钟仔细查看终端的输出。它会列出找到的Boost、TBB、Eigen等库的版本和路径并显示哪些功能被启用ON或禁用OFF。确认没有红色的“NOT FOUND”错误信息。如果有通常是某个依赖没装对需要回头检查。4. 编译、测试与安装临门一脚的细节CMake配置成功生成了Makefile之后就可以开始编译了。这个过程会消耗一些时间取决于你的CPU核心数。我们可以用-j参数来并行编译大幅提速。比如我的电脑是8核的我会用make -j8你可以用nproc命令查看你电脑的CPU线程数然后用make -j$(nproc)来最大化利用CPU。编译过程中终端会滚动输出大量的编译信息。只要不出现error并停止就让它慢慢跑。有时候会出现一些warning这通常是正常的可以忽略。编译完成后强烈建议运行单元测试来验证编译出的库是否功能正常。虽然我们之前关闭了测试编译但gtsam本身自带一些基础测试。运行make test # 或者更详细的 ctest --output-on-failure如果所有测试都通过那么恭喜你编译基本成功了。接下来是安装也就是把编译好的库文件、头文件复制到系统的标准路径下比如/usr/local/lib和/usr/local/include这样其他项目就能方便地找到并使用gtsam了。这里需要管理员权限sudo make install默认的安装前缀是/usr/local。如果你想安装到其他目录比如你自己的家目录下可以在之前的CMake配置阶段加上-DCMAKE_INSTALL_PREFIX/path/to/your/install。安装完成后系统可能不会立即找到这个新库。你需要更新一下动态链接库的缓存sudo ldconfig现在你可以写一个简单的C程序来测试安装是否真的成功了。创建一个test_gtsam.cpp文件#include gtsam/geometry/Pose2.h #include iostream int main() { gtsam::Pose2 pose(1.0, 2.0, 0.5); std::cout GTSAM Pose2 created: x pose.x() , y pose.y() , theta pose.theta() std::endl; return 0; }然后用下面的命令编译它g -stdc11 test_gtsam.cpp -o test_gtsam -lgtsam如果编译成功并运行./test_gtsam能正确输出结果那就大功告成了这证明编译器能正确找到gtsam的头文件和库文件。5. 避坑指南那些我踩过的“雷”理论很顺利现实往往骨感。下面我总结几个最常见的问题和解决方案希望你用不上但万一遇到了也知道怎么解决。5.1 经典的“debug argument must be followed by a library”错误这是新手在Ubuntu 20.04上编译gtsam时最高发的错误没有之一。错误信息长这样CMake Error at wrap/CMakeLists.txt:29 (target_link_libraries): The “debug” argument must be followed by a library.。这个问题的根源是CMake在查找Boost库时在某些版本的Ubuntu/Debian系统上找到的Boost_*_LIBRARY_DEBUG变量可能是空的。而gtsam的CMakeLists.txt里在链接Boost时同时指定了optimized发布版和debug调试版库。当debug库路径为空时CMake语法就报错了。解决办法是手动修改出错的CMakeLists.txt文件。根据错误提示找到具体的文件和行数。通常需要修改两处gtsam/wrap/CMakeLists.txt文件。gtsam/CMakeLists.txt文件。以wrap/CMakeLists.txt为例找到类似下面这段代码set(WRAP_BOOST_LIBRARIES optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE} ${Boost_SYSTEM_LIBRARY_RELEASE} ${Boost_THREAD_LIBRARY_RELEASE} debug ${Boost_FILESYSTEM_LIBRARY_DEBUG} ${Boost_SYSTEM_LIBRARY_DEBUG} ${Boost_THREAD_LIBRARY_DEBUG} )你需要将debug开头的这三行直接删除或者注释掉。注释用#号。修改后变成set(WRAP_BOOST_LIBRARIES optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE} ${Boost_SYSTEM_LIBRARY_RELEASE} ${Boost_THREAD_LIBRARY_RELEASE} # debug # ${Boost_FILESYSTEM_LIBRARY_DEBUG} # ${Boost_SYSTEM_LIBRARY_DEBUG} # ${Boost_THREAD_LIBRARY_DEBUG} )同理去修改gtsam/CMakeLists.txt中报错的行。修改完成后必须彻底清空你的build目录然后重新执行cmake ..和make。因为CMake有缓存只改源码不清理缓存修改可能不生效。最保险的做法是cd build rm -rf * cmake .. make -j$(nproc)5.2 安装时的权限问题在最后执行make install时可能会遇到类似file cannot create directory: /usr/local/doc/cmake-3.14. Maybe need administrative privileges.的错误。这是因为安装过程需要向/usr/local等系统目录写入文件需要root权限。解决方案很简单就像我们之前写的使用sudo make install。但这里有个细节如果你在CMake配置阶段没有用sudo而安装时用了sudo有时会因为环境变量或路径的微小差异导致问题。最一致的做法是整个build目录下的操作cmake, make都用普通用户只在最后安装这一步加sudo。5.3 找不到已安装的gtsam库安装成功后你自己写程序链接时可能会遇到undefined reference to或者cannot find -lgtsam的错误。这通常是链接器找不到库文件。首先确认安装路径是否在系统的库搜索路径中。/usr/local/lib通常是默认搜索的。你可以通过echo $LD_LIBRARY_PATH查看当前库路径如果没有/usr/local/lib可以将其加入export LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH更一劳永逸的方法是将其添加到你的~/.bashrc文件末尾。然后执行source ~/.bashrc使其生效。另外在编译你的程序时如果gtsam安装在了非标准路径你需要用-L指定库路径例如-L/opt/gtsam/lib。5.4 版本冲突与编译选项如果你系统里之前通过其他方式比如apt安装过gtsam可能会和现在手动编译安装的版本冲突。可以用apt list --installed | grep gtsam查看。如果有建议用sudo apt remove libgtsam-dev等命令移除以免链接时找到错误的版本。此外在CMake配置时如果你不确定某些选项比如是否开启Python wrapper是否使用自定义的Eigen保持默认OFF通常是最安全的选择。等核心库能用之后再按需开启高级功能重新编译。6. 进阶配置与性能调优当你成功安装并验证了基础功能后可能还想进一步挖掘gtsam的潜力或者让它更好地融入你的开发环境。这里分享几个进阶小技巧。首先是使用ccache加速二次编译。如果你需要频繁地修改gtsam源码或者调整CMake选项重新编译安装ccache可以大幅缩短编译时间。它通过缓存之前的编译结果来实现。安装和使用都很简单sudo apt install ccache然后在CMake配置命令前加上CXXccache g或者更全局地在你的~/.bashrc里设置export CCccache gcc和export CXXccache g。这样后续的编译尤其是增量编译速度会快很多。其次是集成到你的CMake项目中。当你自己写项目需要使用gtsam时如何在你的CMakeLists.txt中优雅地找到它呢推荐使用CMake的find_package命令。gtsam安装后会提供一个名为GTSAMConfig.cmake的配置文件。你可以在你的项目CMakeLists.txt里这样写cmake_minimum_required(VERSION 3.10) project(MySLAMProject) find_package(GTSAM REQUIRED) # 如果find_package找不到可以手动指定路径 # find_package(GTSAM REQUIRED PATHS /usr/local/lib/cmake/GTSAM) include_directories(${GTSAM_INCLUDE_DIR}) add_executable(my_program main.cpp) target_link_libraries(my_program ${GTSAM_LIBRARIES})这样CMake会自动处理头文件路径和库链接非常方便。如果find_package失败通常是因为CMake的模块路径没有包含gtsam的配置目录。你可以通过上面注释的方法手动指定路径或者将gtsam的cmake配置目录例如/usr/local/lib/cmake/GTSAM添加到CMAKE_PREFIX_PATH环境变量中。最后谈谈MKL的性能实测。正如官方所说MKL不是万能的。在我的经验中对于小规模的因子图优化几百个变量开启MKL带来的加速可能微乎其微甚至因为库调用开销而略慢。但对于大规模、稠密的线性代数运算比如处理视觉SLAM中的大型Bundle Adjustment问题MKL的优势会比较明显。我建议的方法是先不用MKL让你的项目跑起来。如果 profiling 发现线性求解部分确实是瓶颈再考虑启用MKL进行对比测试。启用MKL后在代码中也可以选择使用不同的线性代数后端具体可以参考gtsam文档中关于LinearSolver的说明。记住性能调优永远要基于实际测量而不是盲目猜测。

相关新闻

电商实战:如何通过SPU与SKU优化商品管理?

电商实战:如何通过SPU与SKU优化商品管理?

1. 从混乱到清晰:为什么你的商品管理总是一团糟? 我见过太多电商朋友,尤其是刚入行的新手,一提到商品管理就头疼。后台里商品信息乱七八糟,同一个产品因为颜色不同就建了好几个链接,用户搜起来费劲&#xf…

2026/7/4 15:05:01 阅读更多 →
宝塔面板中phpMyAdmin 405错误与PHP版本兼容性深度解析

宝塔面板中phpMyAdmin 405错误与PHP版本兼容性深度解析

1. 从一次真实的“405惊魂”说起:你的数据库管理页面为什么打不开了? 那天下午,我正像往常一样,准备通过宝塔面板的“数据库”模块,点开那个熟悉的“管理”按钮,进入phpMyAdmin去检查一个WordPress站点的数…

2026/5/17 10:46:33 阅读更多 →
translategemma-27b-it效果实测:图片直接翻译,外贸沟通效率翻倍

translategemma-27b-it效果实测:图片直接翻译,外贸沟通效率翻倍

translategemma-27b-it效果实测:图片直接翻译,外贸沟通效率翻倍 你是不是也遇到过这样的尴尬?海外客户发来一张产品规格图,密密麻麻全是外文,你只能截图、打开翻译软件、手动输入、再对照原文检查,一套流程…

2026/5/17 10:46:33 阅读更多 →

最新新闻

AI论文写作工具全攻略:从文献检索到格式排版

AI论文写作工具全攻略:从文献检索到格式排版

1. 论文写作工具现状与需求分析 本科阶段的论文写作对大多数学生来说都是个不小的挑战。从选题开题到文献综述,从数据分析到格式排版,每个环节都可能成为拦路虎。传统的人工写作方式效率低下,特别是在文献检索和初稿撰写阶段,往往…

2026/7/4 15:06:23 阅读更多 →
Google OAuth 2.0 完整集成指南:从原理到实战,涵盖Web应用与SPA

Google OAuth 2.0 完整集成指南:从原理到实战,涵盖Web应用与SPA

1. 项目概述:为什么你需要一个完整的Google OAuth指南 如果你正在开发一个需要用户登录的Web应用、移动App,或者一个需要访问用户Google日历、Gmail或云端硬盘数据的服务,那么集成Google OAuth认证几乎是绕不开的一步。你可能已经看过官方文档…

2026/7/4 15:06:23 阅读更多 →
TransPaste:基于本地大模型的“复制即翻译”工具实战指南

TransPaste:基于本地大模型的“复制即翻译”工具实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 在日常开发、阅读文档或处理多语言资料时,你是否也厌倦了在浏览器、翻译软件和编辑器之间反复切换?复制、粘…

2026/7/4 15:06:23 阅读更多 →
Si4731与PIC18F87J60打造可编程网络收音机系统

Si4731与PIC18F87J60打造可编程网络收音机系统

1. 项目背景与硬件选型解析这个DIY音频探索项目的核心在于将收音机芯片与微控制器结合,打造一个可编程的旋律捕捉系统。Si4731作为Silicon Labs推出的数字调谐收音机芯片,支持AM/FM/SW接收,而PIC18F87J60则是Microchip旗下集成以太网功能的8位…

2026/7/4 15:02:22 阅读更多 →
大模型量化技术评测与实战指南

大模型量化技术评测与实战指南

1. 大模型量化技术概述在深度学习领域,模型量化已经成为解决大语言模型(LLM)部署难题的关键技术。简单来说,量化就是通过降低模型参数的数值精度来减少存储和计算开销的过程。想象一下,当你需要搬运一堆书籍时,精装版虽然精美但占…

2026/7/4 15:00:21 阅读更多 →
工业级多通道信号采集系统设计与优化实践

工业级多通道信号采集系统设计与优化实践

1. 工业级多通道信号控制系统的核心需求解析在工业自动化、电力监测和精密仪器领域,多通道信号采集与控制系统一直是核心基础设施。这类系统需要同时处理多个传感器信号(如温度、压力、电压等),并对执行机构进行精确控制。传统方案…

2026/7/4 14:58:21 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻