适配环境: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 |
CMake Error: Cannot generate CeresConfig.cmake due to missing Abseil version
解决办法:
cmake .. -Dabsl_VERSION=1.0.0
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
undefined reference to `absl::log_internal::LogMessageFatal...`
解决办法:
CeresConfig.cmake
的 Ceres_LIBRARIES
列表中;Downloading ... failed or hash mismatch
解决办法:
_deps/-src
中指定路径;_deps/-subbuild
;METIS_INCLUDE_DIRS-NOTFOUND
sudo apt install libmetis-dev
fatal error: Eigen/Core: 没有那个文件或目录
sudo apt install libeigen3-dev
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")
保留 _deps
:
find . -maxdepth 1 ! -name '_deps' ! -name '.' -exec rm -rf {} +
问题 | 解决方案 |
---|---|
多版本冲突 | 指定 -Dabsl_DIR=/usr/local/lib/cmake/absl |
CMake 报 version unknown | 添加 abslConfigVersion.cmake |
静态库链接失败 | 使用 -fPIC 或改用动态库 |
报错:
error: unsupported GNU version! gcc versions later than 12 are not supported!
解决办法:
cmake .. -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12
报错:
relocation R_X86_64_TPOFF32 ... can not be used when making a shared object
解决办法:
cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=ON
如无测试需求:
cmake .. -DBUILD_TESTING=OFF
多个 absl/Ceres 并存时:
cmake .. -DCeres_DIR=/usr/local/lib/cmake/Ceres -Dabsl_DIR=/usr/local/lib/cmake/absl
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 路径、版本、静态库链接细节,你就能完全掌控编译流程。