COLMAP 安装在ubuntu20服务器上问题解决全记录

系统配置

GPU:NVIDIA GPU,CUDA 11.8(驱动对应 515+ 版本)
操作系统:Ubuntu 20.04 LTS
内存:≥ 256 GB
编译器:gcc 9.4.0,g++ 9.4.0
CMake:3.30.x(自编译安装到 /usr/local)
Python:系统 Python 3.8.10(避免 Anaconda 环境干扰)
很多问题,都是因为 Anaconda 的库(MKL、libcrypto、libtiff)和 系统库(OpenBLAS、libssl、libtiff5)冲突,所以全程都退回到系统环境。

Ceres(SSH 克隆)+ COLMAP 从零安装

系统前置(保持环境“干净”)

# 退出 conda,避免把 Anaconda 的 libcrypto / MKL / libtiff 带进来
conda deactivate || true

# 临时清理环境变量(可在本终端会话使用)
unset LD_LIBRARY_PATH
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
hash -r

# (可选) 检查当前 python 与 numpy
which python; python --version
python3 -c "import sys; print(sys.version)"

安装系统依赖

sudo apt update
sudo apt install -y \
  build-essential git ninja-build cmake pkg-config \
  libboost-all-dev libeigen3-dev libgoogle-glog-dev libgflags-dev \
  libsuitesparse-dev libopenblas-dev liblapack-dev \
  libfreeimage-dev libtiff-dev libffi-dev \
  libglew-dev qtbase5-dev libqt5opengl5-dev libcgal-dev libmetis-dev \
  libsqlite3-dev libcurl4-openssl-dev

libtiff/libffi 符号未解析,就是靠 libtiff-devlibfreeimage-devlibffi-dev 这几个包解决的。

快速确认:

ldd /usr/lib/x86_64-linux-gnu/libfreeimage.so | grep tiff    # 应该指向 libtiff.so.5
ldconfig -p | grep libffi                                    # 有 libffi.so.7/8

准备 PoseLib 与 Faiss(不用再联网下载)

把已经下载好的 zip 解压到 COLMAP 仓库里的 external 目录

# 假设 COLMAP 在 ~/my_code/colmap
cd ~/my_code/colmap/cmake/external

# 把 zip 解压后的“源码根目录”落在如下路径(重要:目录层级要对)
#   PoseLib -> ~/my_code/colmap/cmake/external/pose_lib/PoseLib/...
#   Faiss   -> ~/my_code/colmap/cmake/external/faiss/faiss/...
# 例如:
# unzip ~/Downloads/PoseLib-master.zip -d pose_lib
# unzip ~/Downloads/faiss-main.zip     -d faiss

Ceres Solver(SSH 克隆 + 构建安装为共享库)

强烈建议用 GitHub 镜像的 SSH(简单可靠)。googlesource 的 SSH 要 Gerrit 账号和 29418 端口,容易卡。

cd ~/my_code
git clone git@github.com:ceres-solver/ceres-solver.git
cd ceres-solver
mkdir -p build && cd build

cmake .. -GNinja \
  -DCMAKE_BUILD_TYPE=Release \
  -DBUILD_TESTING=OFF \
  -DBUILD_EXAMPLES=OFF \
  -DBUILD_SHARED_LIBS=ON \                 # 关键:用 .so,避免 absl 链接错误
  -DCMAKE_INSTALL_PREFIX=/usr/local

ninja -j"$(nproc)"
sudo ninja install

检查安装的 CMake 配置包是否在位:

ls /usr/local/lib/cmake/Ceres/{CeresConfig.cmake,CeresTargets.cmake}

之前的 undefined reference to absl::... 就是因为装成了 静态 libceres.a;上面这步用了 -DBUILD_SHARED_LIBS=ON 专门修复这个问题。

构建 COLMAP(使用本地 PoseLib/Faiss、CUDA 11.8、系统 BLAS)

cd ~/my_code/colmap
rm -rf build && mkdir build && cd build

cmake .. -GNinja \
  -DCMAKE_BUILD_TYPE=Release \
  -DBLA_VENDOR=OpenBLAS \                                   # 强制系统 BLAS,避免找到 Anaconda MKL
  -DFETCH_POSELIB=OFF \
  -DFETCHCONTENT_SOURCE_DIR_POSELIB="$HOME/my_code/colmap/cmake/external/pose_lib/PoseLib" \
  -DFETCH_FAISS=OFF \
  -DFETCHCONTENT_SOURCE_DIR_FAISS="$HOME/my_code/colmap/cmake/external/faiss" \
  -DFAISS_ENABLE_PYTHON=OFF \                                # 关键:禁用 Faiss Python 绑定,避免 CMake 去找 NumPy/SWIG
  -DCeres_DIR=/usr/local/lib/cmake/Ceres \                   # 显式告诉 COLMAP 用我们刚装的 Ceres
  -DEIGEN3_INCLUDE_DIR=/usr/include/eigen3 \                 # Ubuntu 20.04 用头文件路径即可(没必要设 Eigen3_DIR)
  -DPython_EXECUTABLE=/usr/bin/python3 \                     # 用系统 Python,避免 conda
  -DCMAKE_CUDA_COMPILER=/usr/local/cuda-11.8/bin/nvcc \      # CUDA 11.8
  -DCMAKE_CUDA_ARCHITECTURES=native                          # 或者写具体算力:52/61/75/86/89 等

ninja -j"$(nproc)"
# 安装到 /usr/local/bin/colmap(可不装,见下条)
sudo ninja install

说明

  • -DBLA_VENDOR=OpenBLAS:链接到/home/.../anaconda3/lib/libmkl...,这会和系统库冲突。强制 OpenBLAS 后,CMake 不会再捡 MKL。
  • -DFAISS_ENABLE_PYTHON=OFF: “找不到 Python NumPy/Development.Module” 就是 Faiss 的 Python 绑定的问题,关掉即可。
  • -DEIGEN3_INCLUDE_DIR:Ubuntu 20.04 的 Eigen 采用 “头文件包” 模式(/usr/include/eigen3),并不提供 Eigen3Config.cmake,直接给头文件路径最稳。
  • -DCeres_DIR:显式指向 /usr/local/lib/cmake/Ceres,避免找到系统旧版或未配置的包。
  • -DCMAKE_CUDA_ARCHITECTURES:如果自动检测到的是 52 而你的卡更高,可手动设为真实算力(如 86 Ampere、89 Ada)。

运行与验证

# 如果执行了 sudo ninja install
which colmap
colmap -h
colmap gui

# 如果不安装,直接用 build 目录下的可执行文件
./src/colmap/exe/colmap -h
./src/colmap/exe/colmap gui

# (可选) 检查链接到的是系统库而不是 Anaconda
ldd $(which colmap) | egrep "crypto|tiff|ffi|mkl|openblas"

如果不执行 sudo ninja install

  • 可执行文件只在 build/src/colmap/exe/colmap 里,不在 PATH;自己用相对/绝对路径运行即可。
  • 动态库搜索一般没问题(CMake 已设置 rpath 指向 /usr/local、CUDA 路径等)。

遇到过的问题 & 这版怎么规避的

  • CMake 要求 Python/NumPy(来自 Faiss Python 绑定) → 已用 -DFAISS_ENABLE_PYTHON=OFF 彻底禁用。
  • Ceres 链接 absl 符号未解析 → Ceres 改为共享库:-DBUILD_SHARED_LIBS=ON
  • libcrypto.so.3 与 1.1 冲突 → 全程退出 conda,并清理 LD_LIBRARY_PATH
  • libp11-kit.so 提示 ffi_*@LIBFFI_* 未找到 → 安装/重装 libffi-devsudo ldconfig
  • TIFFField* 符号未解析libfreeimage.solibtiff.so.5) → sudo apt install --reinstall libfreeimage-dev libtiff-dev,并用 ldd ... | grep tiff 确认。
  • “Cannot generate a safe runtime search path for swigfaiss…” → 仅是警告;且 Python 绑定已关闭,不再出现。

额外小贴士

  • 保持“干净环境”再编译

    conda deactivate || true
    unset LD_LIBRARY_PATH
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    hash -r
    
  • 强制系统 BLAS:用 -DBLA_VENDOR=OpenBLAS,再也不会把 MKL 从 Anaconda 拿进来。

  • CUDA 架构:如果 native 检测不准,手动写比如 -DCMAKE_CUDA_ARCHITECTURES=86(A100 是 80/86),89(Ada)。

posted @ 2025-09-26 10:28  asandstar  阅读(65)  评论(0)    收藏  举报