系统配置
主机型号:Supermicro SYS-4029GP-TRT2
CPU:Intel Xeon(双路,支持 AVX-512 / OpenMP 4.5)
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-dev
、libfreeimage-dev
、libffi-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 buildcmake .. -GNinja \-DCMAKE_BUILD_TYPE=Release \-DBUILD_TESTING=OFF \-DBUILD_EXAMPLES=OFF \-DBUILD_SHARED_LIBS=ON \ # 关键:用 .so,避免 absl 链接错误-DCMAKE_INSTALL_PREFIX=/usr/localninja -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 buildcmake .. -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-dev
并sudo ldconfig
。TIFFField*
符号未解析(libfreeimage.so
→libtiff.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)。