Ubuntu 20.04 下 COLMAP 编译安装:从 CUDA 架构到依赖冲突的避坑指南
1. 为什么选择源码编译COLMAP很多刚接触三维重建的朋友可能会问为什么不用apt直接安装COLMAP我在实际项目中发现Ubuntu官方仓库的版本往往落后于GitHub主线版本2-3个迭代。比如当前Ubuntu 20.04仓库提供的是3.6版而源码编译可以获取支持NeRF训练的最新3.12版还能自定义CUDA加速等级。更关键的是官方二进制包会屏蔽一些调试功能。去年我在做无人机影像重建时就因无法启用--export_visualization参数而不得不重新编译。源码编译还能灵活控制依赖项版本避免后面做稠密重建时出现OpenGL兼容性问题。2. 环境准备阶段的三个雷区2.1 CUDA工具链的套娃陷阱第一次编译时我习惯性执行了sudo apt install nvidia-cuda-toolkit结果掉进了典型陷阱。这个命令会安装系统级CUDA工具链与已有CUDA环境产生冲突。通过which nvcc查看时你会发现路径变成了/usr/bin/nvcc而非原来的/usr/local/cuda-11.x/bin/nvcc。正确的做法是sudo apt purge nvidia-cuda-toolkit* export PATH/usr/local/cuda-11.x/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.x/lib64:$LD_LIBRARY_PATH记得把11.x替换成你的实际版本号。验证时不仅要看nvcc --version还要用nvidia-smi确认驱动版本兼容性。2.2 CMake版本的隐形门槛官方文档没明说但实测CMake 3.18以下版本会遇到诡异的CUDA检测问题。去年帮学弟debug时发现他用的3.10版本会导致FindCUDA.cmake模块失效。建议用以下命令安装最新版wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh chmod x cmake-3.28.3-linux-x86_64.sh sudo ./cmake-3.28.3-linux-x86_64.sh --prefix/usr/local --skip-license2.3 Conda环境的符号污染遇到过最头疼的问题就是TIFF***LIBTIFF_4.0报错表面看是libtiff版本问题实则是Conda环境变量覆盖了系统路径。有次在实验室服务器上即便执行了conda deactivate仍报错最后发现需要彻底清理conda deactivate unset CONDA_PREFIX unset CONDA_SHLVL建议在~/.bashrc里添加alias colmapbuildunset CONDA_PREFIX unset CONDA_SHLVL每次编译前执行这个别名。3. CMake参数配置实战3.1 CUDA架构的精准打击那个著名的CMAKE_CUDA_ARCHITECTURES must be non-empty错误本质是CMake不知道你的显卡算力等级。我的RTX 3090需要设为86对应Ampere架构而笔记本的RTX 3060应该设61。可以通过以下命令查询/usr/local/cuda-11.x/bin/nvcc --list-gpu-arch更稳妥的做法是在CMake命令里追加cmake .. -DCMAKE_CUDA_ARCHITECTURESnative这个参数会让CMake自动检测当前显卡的最佳算力。3.2 第三方库的路径锁定编译时如果遇到libfreeimage.so的符号冲突除了退出Conda环境还需要显式指定系统库路径cmake .. -DFREEIMAGE_DIR/usr/lib/x86_64-linux-gnu/对于其他关键依赖建议用表格对照检查库名称检测命令推荐版本Eigen3pkg-config --modversion eigen3≥3.3.7Ceresceres_version.h≥2.1.0OpenCVopencv_version≥4.5.03.3 编译器的版本玄学有次在Ubuntu 20.04上g-9会导致稠密重建模块崩溃换成g-8反而正常。建议建立编译隔离环境sudo apt install gcc-8 g-8 export CC/usr/bin/gcc-8 export CXX/usr/bin/g-8可以在CMakeCache.txt里确认最终使用的编译器版本。4. 编译后的验证与调优4.1 安装路径的隐藏规则直接sudo ninja install会装到/usr/local可能污染系统环境。我更喜欢指定私有路径cmake .. -DCMAKE_INSTALL_PREFIX$HOME/colmap_install ninja install export PATH$HOME/colmap_install/bin:$PATH这样卸载时直接删除整个目录即可。4.2 功能模块的按需开启通过CMake参数可以裁剪不需要的模块比如禁用GUI可节省30%编译时间cmake .. -DCUDA_ENABLEDON -DGUI_ENABLEDOFF但要注意如果后续要做MeshLab集成必须开启-DPYTHON_ENABLEDON。4.3 多版本共存的沙盒方案为不同项目维护多个COLMAP版本时可以用Docker构建隔离环境FROM nvidia/cuda:11.8.0-devel-ubuntu20.04 RUN git clone --branch 3.8 https://github.com/colmap/colmap.git \ cd colmap mkdir build cd build \ cmake .. -DCMAKE_CUDA_ARCHITECTURES75这个方案特别适合需要复现论文实验的场景。5. 高频问题速查手册遇到Could NOT find Boost错误时不是简单的apt install libboost-dev就能解决。需要完整安装sudo apt install libboost-program-options-dev \ libboost-filesystem-dev \ libboost-graph-dev \ libboost-system-dev \ libboost-test-dev当看到undefined reference to glewInit时说明OpenGL链接有问题。试试sudo apt install libglew-dev cmake .. -DGLEW_ROOT/usr/lib/x86_64-linux-gnu/最后提醒一个血泪教训编译前务必确认磁盘剩余空间大于20GB有次我的构建过程因为/tmp分区写满而失败排查了半天才发现是这个原因。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2447827.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!