COLMAP 编译全流程问题与解决方案汇总【含Ceres/absl/CUDA/GCC/CMake 报错详解】


🚀 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(需手动切换)
CUDACUDA 12.6
PythonConda + Python 3.10
GPUNVIDIA 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.cmakeCeres_LIBRARIES 列表中;
  • 或将 abseil-cpp 和 ceres 都以动态库编译(推荐)。

COLMAP 编译常见问题

问题 1:依赖无法自动下载(PoseLib / faiss)

Downloading ... failed or hash mismatch

解决办法:

  1. 手动下载 zip 包;
  2. 放置于 _deps/<lib>-src 中指定路径;
  3. 清理 _deps/<lib>-subbuild
  4. 重新编译。

问题 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 缓存 & 系统多版本干扰,是问题高发地;

欢迎留言交流或引用使用此指南,如果对你有帮助,欢迎点赞收藏支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值