当前位置: 首页 > news >正文

Ubuntu 20.04下搞定gici-open编译:从glog报错到ceres版本冲突的保姆级排坑指南

Ubuntu 20.04下gici-open编译全攻略:从依赖管理到实战调试

在GNSS/INS/Camera多传感器融合领域,gici-open作为上海交通大学最新开源的高精度定位框架,凭借其整合RTKLIB、OKVIS等知名算法的优势,正成为研究者和工程师关注的焦点。然而,当你在Ubuntu 20.04环境下尝试编译这个前沿项目时,很可能会遭遇比普通开源库更复杂的依赖地狱——从glog的幽灵冲突到ceres-solver的版本陷阱,每一步都可能让编译进程戛然而止。本文将带你系统性地攻克这些技术难点,不仅提供解决方案,更会揭示问题背后的原理。

1. 环境准备:构建稳健的编译基础

在开始gici-open的编译之前,我们需要确保系统具备完整且兼容的底层依赖。Ubuntu 20.04默认的软件仓库虽然丰富,但直接apt install安装的版本往往无法满足专业计算框架的需求。

必备工具链安装

sudo apt update && sudo apt install -y \ build-essential \ cmake \ git \ libatlas-base-dev \ libsuitesparse-dev

对于gflags和glog这对黄金组合,建议从源码编译安装以获得最佳兼容性。以下是经过验证的安装流程:

  1. 首先解决gflags的依赖:
git clone https://github.com/gflags/gflags.git cd gflags mkdir build && cd build cmake -DBUILD_SHARED_LIBS=ON -DINSTALL_HEADERS=ON .. make -j$(nproc) sudo make install
  1. 接着安装glog(注意链接顺序):
git clone https://github.com/google/glog cd glog mkdir build && cd build cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS=-fPIC .. make -j$(nproc) sudo make install

关键提示:务必保持gflags和glog的安装顺序,并确保LD_LIBRARY_PATH包含/usr/local/lib,可通过export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH临时设置或写入~/.bashrc永久生效。

2. Ceres Solver版本管理:避开依赖冲突雷区

gici-open对Ceres Solver的版本要求较为严格,官方推荐使用2.1.0及以上版本。Ubuntu 20.04默认仓库中的Ceres版本通常较旧,我们需要手动编译安装。

Ceres Solver定制化安装步骤

  1. 安装额外依赖:
sudo apt install -y libgoogle-glog-dev libgflags-dev \ libeigen3-dev libsuitesparse-dev
  1. 从源码编译(以2.1.0为例):
wget ceres-solver.org/ceres-solver-2.1.0.tar.gz tar zxf ceres-solver-2.1.0.tar.gz cd ceres-solver-2.1.0 mkdir build && cd build cmake .. -DEXPORT_BUILD_DIR=ON \ -DBUILD_EXAMPLES=OFF \ -DBUILD_TESTING=OFF make -j$(nproc) sudo make install

安装完成后,需要在gici-open的CMakeLists.txt中显式指定Ceres路径。在project(gici-open)语句后添加:

set(Ceres_DIR "/usr/local/lib/cmake/Ceres") find_package(Ceres REQUIRED)

版本冲突诊断技巧: 当遇到链接错误时,使用ldd工具检查二进制文件的依赖关系:

ldd /usr/local/lib/libceres.so.2.1.0

若发现多个版本的Ceres共存,可通过locate ceres | grep lib定位所有安装位置,然后使用sudo rm -rf谨慎清理旧版本(建议先备份)。

3. glog报错深度解析:根治"重复定义"顽疾

"flag 'logtostderr' was defined more than once"这类错误通常源于系统中存在多个glog版本。Ubuntu环境下常见的问题来源包括:

  • 通过apt安装的libgoogle-glog-dev
  • ROS系统自带的glog组件
  • 手动编译安装的glog版本

系统级清理方案

  1. 全面检测glog安装情况:
dpkg -l | grep glog # 检查deb安装包 locate libglog | grep /usr # 查找所有库文件
  1. 彻底移除冲突版本(谨慎操作):
sudo apt remove --purge libgoogle-glog-dev sudo rm -rf /usr/lib/x86_64-linux-gnu/libglog* sudo rm -rf /usr/local/lib/libglog*
  1. 重新安装纯净版本:
cd glog/build # 之前源码编译的目录 sudo make uninstall make clean cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install

链接顺序优化: 在gici-open的CMakeLists.txt中,确保glog的链接顺序正确:

target_link_libraries(your_target PRIVATE glog::glog # 其他依赖项... )

4. ROS集成特别处理:cv_bridge兼容方案

对于需要ROS集成的用户,cv_bridge的版本冲突是常见痛点。不同于暴力删除系统组件,我们推荐更安全的虚拟环境方案。

ROS Noetic下的稳健配置

  1. 创建独立工作空间:
mkdir -p ~/gici_ws/src cd ~/gici_ws catkin config --init --mkdirs --extend /opt/ros/noetic
  1. 解决OpenCV冲突:
sudo apt install ros-noetic-cv-bridge \ ros-noetic-image-transport
  1. 定制编译选项: 在catkin_make时指定OpenCV版本:
catkin_make -DOpenCV_DIR=/usr/include/opencv4

关键文件对比表

文件类型系统默认位置自定义安装位置优先级设置
OpenCV/usr/include/opencv4/usr/local/include/opencv4CMAKE_PREFIX_PATH
cv_bridge/opt/ros/noetic~/custom_installROS_PACKAGE_PATH
Ceres/usr/lib/cmake/usr/local/lib/cmakeCeres_DIR

当所有编译完成后,运行示例数据集前,请确保:

  1. 配置文件路径正确(使用绝对路径)
  2. 数据集时间戳与配置匹配
  3. 端口未被占用(特别是RTKLIB连接时)

通过这套系统化的编译和调试方法,你应该能够顺利越过gici-open在Ubuntu 20.04上的各种编译障碍。记住,精确的版本控制和干净的依赖管理是成功的关键——这比任何暴力删除都更有效。

http://www.cnnetsun.cn/news/2186068.html

相关文章:

  • 高效解锁Windows多用户远程桌面:RDPWrap完整实用指南
  • SR501人体感应模块在Linux下的三种玩法:从基础驱动到MQTT上报,玩转物联网边缘节点
  • 保姆级教程:用NTU RGB+D 120数据集快速上手骨架行为识别(附完整动作标签清单)
  • Joy-Con Toolkit终极指南:免费解锁Switch手柄隐藏功能
  • 嵌入式系统在工业自动化中的关键技术与应用
  • 本地AI编程助手SwiftIDE:私有化部署与IDE集成实践
  • 保姆级教程:在ROS Noetic上为你的机器人接入科大讯飞星火大模型(附完整代码)
  • Cursor IDE智能体编排插件:构建AI虚拟开发团队工作流
  • CTF实战:如何从TTL字段中提取隐藏图片(附Python代码)
  • 5分钟搞定Switch手柄PC连接:BetterJoy让你的任天堂手柄变身高性能Xbox控制器
  • PCB设计避坑指南:高速信号线为什么不能跨分割走线?附PADS/Altium实战案例
  • MAA明日方舟助手:终极自动化战斗与基建管理完整指南
  • 他用排行第一的降 AI 软件 35 分钟过了知网 AIGC 检测,靠的不是运气。
  • 零代码构建AI智能体:agentforge-openclaw核心架构与实战指南
  • 日志分析告警失效真相大起底(2026年MCP新规强制适配倒计时47天)
  • Cat-Catch 2.5.9:浏览器资源嗅探的终极解决方案
  • BetterGI原神AI辅助工具:释放双手,让游戏回归纯粹乐趣
  • 软件工程师在TVA产业化浪潮中的角色定位与机遇(3)
  • 【紧急预警】监管新规生效倒计时30天!用R语言快速完成欧盟AI Act第10条偏见验证:卡方独立性检验+后验预测检查PPC全流程
  • 告别CUDA依赖:用OpenCL在AMD/Intel/NVIDIA显卡上跑通你的第一个异构计算程序
  • 用Python玩转Jetson Nano串口:一个脚本实现数据收发与回显测试
  • 探索小红书内容宇宙:5个颠覆性方法深度挖掘数据价值
  • 保姆级图解:HDMI音频数据包如何从采样到传输(附N/CTS同步原理)
  • Grinn ReneSOM-V2H边缘AI模块解析与应用
  • 告别手动刷写!用CAPL脚本在CANoe测试模块中自动化调用Vflash文件(附完整代码)
  • 从社交网络到推荐系统:图解GCN(图卷积网络)到底在学什么?
  • SAP CPI实战:手把手教你用RFC适配器打通iFlow与SAP系统(附Groovy脚本调试技巧)
  • 2026-05-02:使所有字符相等的最小删除代价。用go语言,给定一个字符串 s(长度为 n)和一个数组 cost。其中 cost[i] 表示删除 s 中第 i 个字符所需要的代价。你可以任意选择要
  • 科学多模态模型Intern-S1-Pro架构与应用解析
  • 在SpringBoot项目中配置Taotoken作为AI能力供应商