三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

保姆级教程:在Ubuntu 22.04上编译COLMAP 3.9,附赠6个常见编译错误的解决方案

保姆级教程:在Ubuntu 22.04上编译COLMAP 3.9,附赠6个常见编译错误的解决方案

从零构建三维视觉利器:Ubuntu 22.04下COLMAP 3.9全流程编译指南

在三维重建领域,COLMAP作为开源的摄影测量工具链,已成为学术界和工业界的标准选择之一。不同于直接安装预编译版本,从源码构建能获得最新特性、定制化功能和更深层次的问题排查能力。本指南将系统性地带领你完成Ubuntu 22.04环境下COLMAP 3.9的完整编译过程,并针对高频出现的6类编译陷阱提供预防性解决方案。

1. 环境预检与依赖准备

编译前的环境准备如同建筑地基,决定了后续过程的稳定性。Ubuntu 22.04虽然提供了良好的基础环境,但仍需特别注意以下关键点:

系统环境检查清单

# 验证系统版本 lsb_release -a # 检查GPU驱动状态 nvidia-smi # 确认CUDA版本 nvcc --version

对于依赖管理,推荐使用APT结合手动验证的方式。以下命令将安装所有必需依赖:

sudo apt-get update && sudo apt-get install -y \ git cmake ninja-build build-essential \ libboost-all-dev libeigen3-dev libflann-dev \ libfreeimage-dev libmetis-dev libgoogle-glog-dev \ libgtest-dev libsqlite3-dev libglew-dev \ qtbase5-dev libqt5opengl5-dev libcgal-dev \ libceres-dev

注意:若系统已安装Anaconda,建议创建独立conda环境或暂时禁用conda基础环境,避免QT库路径冲突。

关键版本要求对照表

组件最低版本推荐版本验证命令
GCC9.011.3gcc --version
CMake3.163.22+cmake --version
CUDA11.011.8nvcc --version
Eigen3.33.4pkg-config --modversion eigen3

2. 源码获取与编译配置

COLMAP的代码仓库更新频繁,建议从官方GitHub获取最新稳定分支:

git clone --branch 3.9 https://github.com/colmap/colmap.git cd colmap && mkdir build && cd build

CMake配置阶段是问题高发区,推荐使用以下参数组合:

cmake .. -GNinja \ -DCMAKE_BUILD_TYPE=Release \ -DCUDA_ARCHITECTURES="native" \ -DTESTS_ENABLED=OFF

若遇到CUDA架构报错(如compute_native不支持),需明确指定计算能力:

# 查询显卡计算能力(以RTX 3080为例) nvidia-smi --query-gpu=compute_cap --format=csv # 输出结果为8.6时,配置应改为 -DCUDA_ARCHITECTURES="86"

3. 高频编译问题诊断手册

3.1 Anaconda环境下的QT库冲突

现象:编译过程中出现libfreeimage.so: undefined reference to TIFFFieldName@LIBTIFF_4.0等链接错误。

根治方案

  1. 临时禁用conda环境:
    conda deactivate
  2. 手动指定QT路径:
    cmake .. -DCMAKE_PREFIX_PATH="/usr/lib/x86_64-linux-gnu/cmake/Qt5"

3.2 内存不足导致的进程终止

典型报错collect2: fatal error: ld terminated with signal 9 [Killed]

解决方案矩阵

环境类型调整方法操作命令
物理机增加swap空间sudo fallocate -l 8G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
WSL2调整内存限制%UserProfile%\.wslconfig中添加[wsl2] memory=16GB
虚拟机修改VM配置通过virt-manager分配更多内存

3.3 CUDA架构不匹配问题

预防措施

  1. 提前查询设备计算能力:
    nvidia-smi --query-gpu=compute_cap --format=csv
  2. 在CMake中精确指定:
    -DCUDA_ARCHITECTURES="75" # 对应Turing架构

3.4 多线程数据库访问异常

现象:特征匹配时出现sqlite error :disk i/o error

临时解决方案

colmap exhaustive_matcher --database_path database.db --SiftMatching.num_threads 1

永久修复: 修改src/feature/matching.cc中的线程同步逻辑,添加SQLite事务锁机制。

4. 编译优化与安装后测试

启用并行编译加速过程:

ninja -j$(nproc)

安装到系统路径:

sudo ninja install

验证安装结果:

colmap -h # 预期输出帮助菜单

性能调优参数

cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCUDA_FAST_MATH=ON \ -DEIGEN_USE_BLAS=ON

5. 三维重建实战检验

通过微型数据集验证编译结果:

mkdir -p test/{images,sparse,dense} # 复制5-10张测试图片到test/images colmap feature_extractor \ --database_path test/database.db \ --image_path test/images colmap exhaustive_matcher \ --database_path test/database.db colmap mapper \ --database_path test/database.db \ --image_path test/images \ --output_path test/sparse

6. 深度集成开发建议

对于需要二次开发的用户,推荐配置VS Code开发环境:

  1. 安装C++插件包
  2. 配置c_cpp_properties.json包含COLMAP头文件路径
  3. 使用compile_commands.json实现代码跳转:
    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. ln -s build/compile_commands.json .

遇到复杂编译问题时,可启用详细日志分析:

cmake --debug-trycompile .. ninja -v > build.log 2>&1
← 返回列表