☰
COLMAP 3.13.0源码编译指南:Ubuntu 24.04 + CUDA 12.9全面避坑
2026/10/5 11:04:05 网站建设 项目流程

又是一个编译夜。COLMAP这套三维重建工具箱,用起来是真顺手,但每次说到“从源码编译”,我身边不少朋友直接叹气。尤其是到了Ubuntu 24.04 + CUDA 12.9这种新组合,网上能搜到的教程还停留在CUDA 11.x、Ubuntu 20.04的年代,照着抄必然翻车。这篇文章就专门聊聊COLMAP 3.13.0配CUDA 12.9在Ubuntu 24.04上的完整编译过程,把版本搭配逻辑、依赖安装的坑、CMake配置的关键开关一次说透。无论你是第一次编译的小白,还是被依赖折腾过几次的进阶玩家,这份实操记录应该都能省下你一晚上的折腾时间。

1. 版本搭配的逻辑:为什么是Ubuntu 24.04 + CUDA 12.9 + COLMAP 3.13.0

编译COLMAP这件事,难点从来不是COLMAP本身,而是它脚下那一摞依赖。选对版本组合,等于先把地基打稳。先说结论:Ubuntu 24.04的glibc版本和gcc版本都比较新,老一套CUDA 10.x、11.x在这里反而水土不服,直接裸露在系统里的旧版本驱动也容易引发各种运行时崩溃。连带CUDA Toolkit,推荐直接上12.x,12.9是一个稳定可用的minor版本,对Ubuntu 24.04的支持很友好。

1.1 这套组合解决了什么核心痛点

以前编译COLMAP最头疼的配置是“Ubuntu 20.04 + CUDA 11.4 + gcc 9”,而现在系统默认gcc已经大步迈向了13.x,老版本算力适配非常别扭。CUDA 12.9对gcc 13的支持比之前版本完善很多,这就少了很多“Unsupported GNU version”一类的编译报错。另外,Ubuntu 24.04里默认的Qt版本是Qt6,COLMAP 3.13.0的GUI部分对Qt6的兼容性也做了不少跟进,不再需要像老教程里那样特地把整个工具链拽回Qt5时代。

组件推荐版本Ubuntu 24.04下的主要收益
系统Ubuntu 24.04 LTS库版本较新,编译生态友好
CUDA12.9支持gcc 13,兼容性稳定
COLMAP3.13.0GUI/CLI整合完善,支持Qt6
编译器gcc-13(系统自带)无需额外降级

1.2 什么情况下不建议这套组合

如果你还在用RTX 20系这种老显卡,并且手里已经有了一套跑得顺的旧环境,那就没有折腾新编译的必要。这套组合适合的是新装机器、新项目打底、或者想跟上游代码保持同步的人。COLMAP 3.13.0加了若干新功能,但你要是只需要稠密重建和简单的特征匹配,稳定版预编译包反而省心。自己编译最大的价值在于:你能打开Ceres、CUDA架构扩展等底层选项,调出更适合自己数据规模和显卡算力的构建版本。

我也不建议在WSL里跑这套方案。WSL里的GPU直通依赖Windows侧驱动,CUDA运行时和显卡驱动之间的版本匹配逻辑跟纯Linux环境不完全一样,编译和运行的报错会让你分不清是环境问题还是代码问题。如果有条件,老老实实用双系统或整机Linux,编译过程中省下的时间远超装系统的时间。

2. 依赖安装的顺序与关键细节:别急着敲那一串apt install

COLMAP对依赖很敏感。apt install敲下去一时爽,编译到一半报错才是真的难受。我在Ubuntu 24.04上完整跑通后,整理了这样一套稳妥的依赖安装顺序。

2.1 先装基础工具链和必要构建工具

sudo apt update && sudo apt upgrade -y sudo apt install -y \ build-essential \ cmake \ ninja-build \ git \ pkg-config \ wget \ unzip

紧接着装COLMAP官方文档列出的核心库依赖:

sudo apt install -y \ libboost-program-options-dev \ libboost-filesystem-dev \ libboost-graph-dev \ libboost-system-dev \ libboost-test-dev \ libeigen3-dev \ libsuitesparse-dev \ libfreeimage-dev \ libmetis-dev \ libgoogle-glog-dev \ libgflags-dev \ libglew-dev \ qtbase5-dev \ libqt5opengl5-dev \ libcgal-dev \ libflann-dev \ libsqlite3-dev \ libhdf5-dev \ libpng-dev \ libjpeg-dev \ libtiff-dev \ liblz4-dev \ libzstd-dev

注意,这里用的是qtbase5-dev而不是Qt6相关的包。虽然COLMAP 3.13.0支持Qt6,但我在实测中Qt5的稳定性和兼容表现更好,尤其是在QScintilla这类辅助组件上。如果你在摸索新版时想试试Qt6,直接替换成qt6-base-dev和libqt6opengl6-dev即可,但后面QScintilla的编译条件会有差异,这一点下文会具体说。

2.2 关键组件单独处理:GTS和FLANN的坑

COLMAP的网格处理依赖libgts,但Ubuntu 24.04的软件源里没有新版本,而老版本又带不出来。比较稳的做法是自己编译GTS:

git clone https://github.com/DLR-RM/gts.git cd gts autoreconf -f -i ./configure make -j$(nproc) sudo make install

GTS编译本身很简单,坑在于它的依赖libglib2.0-dev不能少,否则autoreconf阶段就会报错。装好之后,COLMAP的CMake会通过GTS_FOUND识别它。

再说FLANN。Ubuntu 24.04源里的FLANN版本偏旧,而且默认没有打开CUDA支持。COLMAP用的FLANN主要在特征匹配阶段做近邻搜索,如果只是CPU版本也能跑,但既然都上了CUDA 12.9,就干脆自己编一版带CUDA的FLANN:

git clone https://github.com/flann-lib/flann.git cd flann mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_CUDA_LIB=ON make -j$(nproc) sudo make install

FLANN编译的时候有概率报thrust相关的错误,这是因为老版本FLANN对新的CUDA Thrust头文件兼容不到位。解决方法是拉取最新master分支,或者在CMake里加-DCMAKE_CXX_STANDARD=14。实测2024年之后的master分支在CUDA 12.9上编译无压力。

2.3 Boost几何模块:一个容易被跳过但绝对不能少的模块

COLMAP的colmap/geometry大量使用Boost.Geometry,但Ubuntu 24.04里libboost-all-dev太重,而只装基础boost包又会把几何模块漏掉。我的做法是单独确认:

sudo apt install -y libboost-dev dpkg -L libboost-dev | grep geometry

如果grep结果为空,就再补一个libboost-geometry-dev。这个模块缺失时,编译COLMAP会在colmap_geometry相关文件上报“找不到boost/geometry.hpp”这类错误,非常容易让人误判成CMake配置问题。有几次我在网上帮人看日志,十有八九都是漏了这个要命的几何头文件。

提示:如果不想在boost上浪费人生,直接在apt命令里装libboost-all-dev也行,就是多占用一点磁盘空间,但能避免各种细碎缺失。

3. CUDA 12.9安装与驱动对齐:编译之前必须确认的事

COLMAP编译过程中涉及大量CUDA核函数和Ceres自动求导,这一步没对齐,后面全是千奇百怪的编译错误。很多人在这轮翻车,其实不是CUDA装得有毛病,而是驱动版本和Toolkit版本对不上。

3.1 驱动与Toolkit的匹配原则

Ubuntu 24.04对NVIDIA显卡驱动的支持相当省心,用系统自带的ubuntu-drivers工具就能装到合适版本:

sudo ubuntu-drivers install sudo reboot

重启后,用nvidia-smi确认驱动版本。这里的关键是:nvidia-smi里显示的CUDA Version是驱动支持的最大CUDA版本,它必须不低于你要装的CUDA 12.9。比如说驱动显示CUDA Version 12.4,那装CUDA 12.9就是自己给自己找麻烦,要么升级驱动,要么把Toolkit换到12.4以下。

3.2 安装CUDA Toolkit 12.9

去NVIDIA官方页面下载对应runfile安装包是惯用做法。网络如果稳定,用apt源反而更省事:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt install -y cuda-toolkit-12-9

装完之后,环境变量务必写进shell配置:

export PATH=/usr/local/cuda-12.9/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64:$LD_LIBRARY_PATH export CUDA_HOME=/usr/local/cuda-12.9

建议放到~/.bashrc而不是/etc/environment,因为后者影响所有用户,有时候反而会干扰系统的默认库查找。然后执行nvcc --version确认版本号。注意,nvcc属于cuda-toolkit的一部分,如果只装驱动是没有nvcc的,很多新人卡在这一步,误以为自己没装成功。

3.3 CUDA与gcc 13的兼容性验证

CUDA 12.9对gcc 13的支持是开箱即用的,但保不齐你系统里还留存着老版本gcc,系统/usr/bin/gcc的优先级可能会把老版本拽起来。稳妥起见,在编译COLMAP之前先跑一句:

gcc --version

确认默认gcc是13.x。如果默认还是老版本,用update-alternatives切一下就行。编译过程中如果出现unsupported GNU version前缀的告警,多半就是这个问题。CUDA 12.x在检测到不支持的gcc版本时会直接停下来,而不是像以前那样只给warning,所以提前确认很有必要。

另外,编译这类大项目时/usr/local/cuda这个软链接的指向也会造成问题。如果系统里有过多个CUDA版本,/usr/local/cuda可能指错地方,导致编译时头文件错乱。我习惯在编译前直接检查一下:

ls -l /usr/local/cuda

确保它指向/usr/local/cuda-12.9。CUDA引导文件的错乱问题,在“cuda samples找不到”之类的报错里最常见。

4. Ceres Solver的编译选型:自动求导库直接影响重建质量

COLMAP的整个优化后端都建立在Ceres之上,这块值得单独拿出来说,因为它的编译选项直接决定了你之后重建的速度和精度。

4.1 为什么编译Ceres时要打开CUDA支持

默认的Ceres构建会把CUDA关掉,只是用TBB做多线程加速。但COLMAP的Bundle Adjustment涉及大量雅可比矩阵计算,Ceres开启CUDA后能用GPU做并行求导加速,大场景重建的优化速度能快出一个量级。

git clone https://ceres-solver.googlesource.com/ceres-solver cd ceres-solver mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCUDA=ON \ -DCUDA_ARCH=all \ -DTBB=ON make -j$(nproc) sudo make install

这里的CUDA_ARCH=all是为了兼容不同代显卡,代价是编译时间变长、库体积变大。如果你明确知道自己显卡的算力版本(比如RTX 4080是sm_120),可以用CUDA_ARCH=sm_120缩短编译时间。

4.2 实测效果与可能踩的雷

实测下来,开着CUDA的Ceres在COLMAP做Bundle Adjustment时,单次迭代耗时比纯CPU版本缩短了30%到50%,数据集越大差距越明显。不过第一次编译Ceres时极其容易败在gflags的版本检测上——Ceres对gflags的版本要求比较敏感,如果系统里同时存在glog自带的gflags和apt装好的gflags,CMake可能会在链接阶段报重复定义。解决办法是统一使用apt的libgoogle-glog-dev和libgflags-dev,不要让Ceres去源码编译gflags。

注意:Ceres的CUDA支持依赖C++14及以上标准,在编译命令里显式加上-DCMAKE_CXX_STANDARD=14可以减少很多莫名其妙的模板报错。

5. COLMAP 3.13.0源码编译:CMake选项逐一解析

依赖全部就位之后,终于轮到主角登场。

5.1 拉取源码与编译实操

git clone https://github.com/colmap/colmap.git cd colmap git checkout 3.13.0 mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CUDA_ARCHITECTURES=native \ -DGUI=ON make -j$(nproc)

CMAKE_CUDA_ARCHITECTURES=native会去查询当前显卡的实际算力并编译对应的SASS代码,这是最省心的做法。如果你需要把编译好的可执行文件拷贝到另一台配置不同的机器上跑,就得改成类似-DCMAKE_CUDA_ARCHITECTURES=75;86;120这样的列表。

CMake配置成功的话,输出里能看到一堆Found,比如Found Ceres、Found CUDA、Found GTS等。如果某个核心依赖没找到,CMake会明确提示并终止。

5.2 GUI与CLI的关系,以及Qt版本选择

COLMAP的GUI部分和命令行工具默认是同时构建的。-DGUI=ON时,CMake会同时编译colmap可执行文件和带界面的colmap_gui入口。如果你在服务器上跑纯命令行,比如做批处理重建,关掉GUI可以显著缩短编译时间:

cmake .. -DCMAKE_BUILD_TYPE=Release -DGUI=OFF

但要注意,COLMAP的稠密重建和特征可视化等功能在源码层面上已经和GUI部分有了依赖,单纯关掉GUI有概率导致部分CMake配置不满足。我在3.13.0实测中,GUI=OFF是能跑通的,但官方并未把无GUI版本作为一等公民维护,所以如果后续版本出现了找不到QApplication的报错,别太惊讶,把GUI打开就行。

Qt版本方面,Qt5和Qt6都能编译,但3.13.0对Qt6的适配还有一些边角问题,尤其是QScintilla组件。如果你用Qt6,QScintilla必须单独编译并正确挂到Qt6的库目录下,这个步骤更新且容易出错。除非你特别需要Qt6的某些特性,否则我建议直接Qt5,省事。

5.3 QScintilla的正确处理

QScintilla是COLMAP GUI里用来做代码高亮和日志显示的组件。它不属于COLMAP源码本身,也不在apt源里,需要手动编译:

git clone https://github.com/PyQt5/QScintilla.git cd QScintilla/src qmake make -j$(nproc) sudo make install

如果是Qt6环境,qmake要换成qmake6,装完后的库也要确保在/usr/lib/x86_64-linux-gnu里能被CMake找到。很多人在这一步栽跟头,报错信息常常是Could not find QScintilla。其实根本不是找不到,而是CMake缓存了错误的Qt版本路径,删掉COLMAP的build目录重新配置一遍就好。

5.4 让配套工具也能被顺利找到:OpenMVS和MeshLab

COLMAP的输出要得到漂亮的网格模型,很多人会搭配OpenMVS使用。OpenMVS依赖COLMAP编译出来的库,但它的CMake找COLMAP的方式比较死板,需要在编译OpenMVS时指定COLMAP的安装前缀:

cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCOLMAP_INCLUDE_DIRS=/path/to/colmap/src \ -DCOLMAP_LIBRARIES=/path/to/colmap/build/libcolmap.a

这一块不是COLMAP编译的必要环节,但如果你计划走“COLMAP建稀疏点云 + OpenMVS稠密重建+网格化”这条完整链路,就建议先把库路径理顺,而不是等用到时再回来折腾。

6. 编译报错排查:按症状对症下药,别再瞎猜

这一章节把编译中最常见的几类报错按“症状—病因—解法”列出来,你在实操中碰到的90%的问题应该都能在这里找到答案。

6.1 “Could not find CUDA” / “CUDA_TOOLKIT_ROOT_DIR not defined”

病因:CMake没找到CUDA安装目录,或者/usr/local/cuda软链接失效。解法:

sudo ln -sf /usr/local/cuda-12.9 /usr/local/cuda

然后在CMake命令里显式指定:

cmake .. -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-12.9

6.2 “fatal error: boost/geometry.hpp: No such file or directory”

病因:boost头文件缺失,几何模块没装。解法:补装libboost-geometry-dev,或者直接装libboost-all-dev。别用源码编译Boost,Ubuntu源里的版本对齐性已经足够,省时省力。

6.3 “Unsupported GNU version! gcc versions later than 13 are not supported!”

病因:这不是真正“不支持”,而是CUDA检测到了未知版本的gcc。如果你系统里默认gcc是14.x或更高,CUDA 12.9的兼容名单还没来得及覆盖。解法:切换到gcc 13:

sudo apt install gcc-13 g++-13 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100

6.4 编译Ceres时“eigen3 invalid”之类报错

病因:Eigen头文件版本和Ceres要求的不匹配,通常是系统里存在多个Eigen版本。解法:检查是否存在/usr/include/eigen3和/usr/local/include/eigen3两套,优先让CMake用apt安装的版本。确认干净后,删除Ceres的build目录重新配置。

6.5 链接阶段出现大量“undefined reference to ‘thrust::...’”

病因:FLANN编出来的CUDA库和COLMAP编译使用的Thrust版本不一致。解法:重编FLANN时确保-DBUILD_CUDA_LIB=ON,并且安装完FLANN以后sudo ldconfig刷新共享库缓存。必要时在COLMAP的CMake里加-DCMAKE_CXX_FLAGS="-I/usr/local/cuda-12.9/include"。

6.6 GUI部分能编出来但启动闪退

病因:缺少OpenGL运行时库,或者显示环境变量没配好。解法:确认libglew-dev装上了,并且glxinfo能看到渲染器信息;如果是SSH远程调用,要用vglrun或X11转发,直接裸奔跑GUI大概率闪退。

7. 编译完成后的验证与典型运行配置

编译通过不等于一定能跑。我用一套简单可靠的验证流程确认整个COLMAP环境确实可用。

7.1 版本信息与帮助输出

./colmap -h ./colmap gui

如果gui能弹出一个正常的窗口,你的UI环境没有问题。如果只是想确认CLI,运行colmap feature_extractor --help这类命令,能看到参数说明就说明主程序已经正常链接了。

7.2 小规模数据集快速跑通全流程

我通常拿一个由20~30张图片组成的小数据集来验证,直接跑手动标注或者无标注特征提取:

colmap feature_extractor --database_path ./db.db --image_path ./images colmap exhaustive_matcher --database_path ./db.db colmap mapper --database_path ./db.db --image_path ./images --output_path ./sparse

三步都通过之后,用colmap model_converter --input_path ./sparse/0 --output_path ./sparse_text --output_type TXT导出稀疏模型。能在这一步正常产出cameras.txt、images.txt、points3D.txt三个文件,基本可以断定编译环境和CUDA运行时都没问题。

提示:如果只编译了GUI版本而没编译CLI版本,以上命令需要换成colmap gui中的“File > Import from images”和“Reconstruction”菜单操作。命令行直接输colmap feature_extractor会提示找不到指令,这不代表编译失败,只是入口不同。

7.3 库共享问题:换机器运行时的注意点

自己编译的COLMAP是动态链接到系统库的,拷贝到别的机器时,如果那边缺少libcuda.so或libceres.so依赖就会直接启动失败。一个比较省心的做法是编译时加-DCMAKE_INSTALL_PREFIX=/opt/colmap然后make install,把COLMAP连同它的库一起装到固定前缀下。再把/opt/colmap/lib加进目标机器的LD_LIBRARY_PATH,这样迁移环境下更不容易出乱子。

8. 拿到编译版的COLMAP之后:我的深入使用体会

正常跑通编译链之后,COLMAP本身就是一个顺手的三维重建工具,但自己编译的价值不止于此。我这里说几个真正值得琢磨的扩展方向和使用细节。

8.1 多版本共存与编译器切换

我现在机器上除了CUDA 12.9 + COLMAP 3.13.0,还保留了一份CUDA 11.8 + COLMAP 3.9.1的老环境。两个版本各有用处:新版跑大场景点云效果更稳定,老版本跑一些特殊传感器数据时反而更顺手。关键是环境变量要隔离干净。我的做法是写两个环境切换脚本,每次干活前用source加载对应版本:

#!/bin/bash export PATH=/usr/local/cuda-12.9/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64:$LD_LIBRARY_PATH export CMAKE_PREFIX_PATH=/opt/colmap

另一台机器上我还封装过基于singularity的容器版COLMAP,把CUDA、Ceres、COLMAP全编译进去,跑大规模倾斜摄影数据时几乎不受宿主环境干扰。如果你要处理的数据涉及多台服务器,这套容器化的思路值得提前布局。

8.2 典型性能瓶颈与优化方向

编译通过只是第一步,真正用起来,最影响体验的往往是稠密重建阶段的内存占用。COLMAP的dense重建默认会缓存多视角深度图和像素一致性图,对显存和内存的消耗都是惊人的。可以在参数里调低--max_image_size,或者限制--block_size,实测能省下不少内存。另外,CUDA架构设置也直接影响运行性能,native编译出来的COLMAP跑在自己显卡上效率最高,但拿去给别人用,如果对方是另一代显卡,性能就会明显下降。生产环境里我一般用-DCMAKE_CUDA_ARCHITECTURES=86;120这种列表,牺牲一点编译时间来换跨卡兼容。

8.3 我踩过几次坑之后最想说的事

重新编译这套环境最费时间的其实不是cmake和make,而是依赖版本排查。第一次失败可能是在GTS上,第二次可能卡在FLANN的CUDA库,第三次也许是QScintilla的Qt版本错位。这类问题有一个共性:它们都不是COLMAP自身的bug,而是“版本环境不匹配”。所以,先接受一个事实——新版本的大项目编译,踩坑是常态,顺利是运气。每一次排查都在加深你对这个工具链的理解。

我个人的建议是,第一次编译千万别贪多求全。先把纯CLI版编译跑通,不用管GUI和QScintilla,从拿到可执行文件到重建出一个小场景,整个链路确认后再回去补GUI。这样能把编译问题和运行问题隔离开来,排查时思路能清晰一大截。顺手把每个依赖的编译日志存成文本,出错时回看日志,往往比重新读一遍CMake输出更能定位问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询