🚀 Ceres Solver & COLMAP 编译全流程问题与解决方案汇总【含 absl/CUDA/GCC/CMake 报错详解】
适配环境:Ubuntu 24.04 + GCC 12/13 + CUDA 12.6 + Conda + RTX 4090
本文总结了从源码编译 Ceres Solver + COLMAP(无GUI) 全流程中遇到的所有实际问题、报错信息、成因分析与解决办法,适用于从事 3DGS / SfM / 三维视觉方向的开发者。包含对 abseil-cpp 静态库依赖、CMake 配置、CUDA 编译兼容性等关键问题的深入分析。
前置环境说明
推荐环境配置如下:
组件 | 版本 |
---|---|
操作系统 | Ubuntu 24.04 |
编译器 | GCC 12 / GCC 13(需手动切换) |
CUDA | CUDA 12.6 |
Python | Conda + Python 3.10 |
GPU | NVIDIA RTX 4090 |
CMake | ≥ 3.16 |
Ceres Solver 编译常见问题
问题 1:absl 版本缺失
CMake Error: Cannot generate CeresConfig.cmake due to missing Abseil version
解决办法:
cmake .. -Dabsl_VERSION=1.0.0
问题 2:abslConfig.cmake 缺失或不兼容
Could not find a configuration file for package "absl" that is compatible with requested version "1.0.0"
解决办法:
sudo tee /usr/local/lib/cmake/absl/abslConfigVersion.cmake <<EOF
set(PACKAGE_VERSION "1.0.0")
if(PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
EOF
问题 3:静态库链接 absl 报 undefined reference
undefined reference to `absl::log_internal::LogMessageFatal...`
解决办法:
- 把所有 absl 静态库全部加到
CeresConfig.cmake
的Ceres_LIBRARIES
列表中; - 或将 abseil-cpp 和 ceres 都以动态库编译(推荐)。
COLMAP 编译常见问题
问题 1:依赖无法自动下载(PoseLib / faiss)
Downloading ... failed or hash mismatch
解决办法:
- 手动下载 zip 包;
- 放置于
_deps/<lib>-src
中指定路径; - 清理
_deps/<lib>-subbuild
; - 重新编译。
问题 2:找不到 METIS
METIS_INCLUDE_DIRS-NOTFOUND
sudo apt install libmetis-dev
问题 3:Eigen3 缺失
fatal error: Eigen/Core: 没有那个文件或目录
sudo apt install libeigen3-dev
问题 4:CeresConfig.cmake 缺失
Could not find a package configuration file provided by "Ceres"
手动创建 /usr/local/lib/cmake/Ceres/CeresConfig.cmake
:
set(Ceres_FOUND TRUE)
set(Ceres_INCLUDE_DIRS "/usr/local/include")
set(Ceres_LIBRARIES "/usr/local/lib/libceres.a;...所有 absl 静态库; -lglog -lgflags -llapack -lblas")
问题 5:清理 build 导致依赖丢失
保留 _deps
:
find . -maxdepth 1 ! -name '_deps' ! -name '.' -exec rm -rf {} +
absl 相关问题汇总
问题 | 解决方案 |
---|---|
多版本冲突 | 指定 -Dabsl_DIR=/usr/local/lib/cmake/absl |
CMake 报 version unknown | 添加 abslConfigVersion.cmake |
静态库链接失败 | 使用 -fPIC 或改用动态库 |
GCC/CUDA 编译兼容性
报错:
error: unsupported GNU version! gcc versions later than 12 are not supported!
解决办法:
cmake .. -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12
静态库链接与 -fPIC 问题
报错:
relocation R_X86_64_TPOFF32 ... can not be used when making a shared object
解决办法:
cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
GTest/GMock 测试库问题
如无测试需求:
cmake .. -DBUILD_TESTING=OFF
依赖管理与多版本冲突
多个 absl/Ceres 并存时:
cmake .. -DCeres_DIR=/usr/local/lib/cmake/Ceres -Dabsl_DIR=/usr/local/lib/cmake/absl
建议的 CMake 构建配置
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DGUI_ENABLED=OFF \
-DCUDA_ENABLED=ON \
-DCeres_DIR=/usr/local/lib/cmake/Ceres \
-Dabsl_DIR=/usr/local/lib/cmake/absl \
-DBUILD_TESTING=OFF \
-DCMAKE_C_COMPILER=gcc-12 \
-DCMAKE_CXX_COMPILER=g++-12 \
-Dabsl_VERSION=1.0.0
构建后测试指令
# 测试 Ceres 编译情况
ls /usr/local/include/ceres/jet.h
ls /usr/local/lib/libceres*
# 测试 COLMAP 是否成功
colmap help
实测环境与效果
组件 | 状态 |
---|---|
Ubuntu 24.04 | ✅ |
GCC 13 + GCC 12 | ✅ |
CUDA 12.6 | ✅ |
RTX 4090 | ✅ |
COLMAP 编译(无 GUI + CUDA) | ✅ 成功 |
Ceres Solver 编译(静态链接 absl) | ✅ 成功 |
Gaussian Splatting 使用该套链路 | ✅ 成功运行 SfM 重建 |
附录:一键检查脚本
#!/bin/bash
echo "=== 检查关键依赖路径 ==="
echo "✔ Eigen3:"; ls /usr/include/eigen3/Eigen/Core || echo "✘ 缺失"
echo "✔ Ceres:"; ls /usr/local/include/ceres/jet.h || echo "✘ 缺失"
echo "✔ absl:"; ls /usr/local/lib/libabsl_* || echo "✘ 缺失"
echo "✔ CeresConfig.cmake:"; ls /usr/local/lib/cmake/Ceres/CeresConfig.cmake || echo "✘ 缺失"
echo "✔ abslConfig.cmake:"; ls /usr/local/lib/cmake/absl/abslConfig.cmake || echo "✘ 缺失"
echo "✔ CUDA:"; nvcc --version || echo "✘ 未安装 nvcc"
✅ 总结
COLMAP 与 Ceres 的编译不再神秘。控制好 absl/Ceres 路径、版本、静态库链接细节,你就能完全掌控编译流程。
- 如遇无法下载依赖,手动下载、校验 hash;
- absl 静态链接是最大“坑”,建议用动态库;
- CMake 缓存 & 系统多版本干扰,是问题高发地;