问题背景
在编译 nvblox 项目时,遇到 CMake 配置错误:
CMake Error at cmake/FindGlog.cmake:103 (message):
Failed to find glog - Could not find glog include directory
尝试通过 apt 安装 libgoogle-glog-dev 时,出现依赖冲突:
The following packages have unmet dependencies:
libgoogle-glog-dev : Depends: libunwind-dev or libunwind7-dev but it is not installable
问题原因分析
1. libunwind 版本冲突
在 Ubuntu 22.04 系统中,同时存在两个互斥的 libunwind 开发包:
- libunwind-14-dev:由 LLVM/Clang 14 工具链引入
- libunwind-dev:系统标准版本
这两个包提供了相同的文件,无法共存安装。
2. 冲突根源
LLVM 工具链中的 libunwind-14-dev 与系统标准的 libunwind-dev 包定义互斥,导致 libgoogle-glog-dev 无法安装。
解决方案实施
第一步:查看当前 libunwind 包状态
bash
dpkg -l | grep libunwind
输出显示:
ii libunwind-14:amd64 1:14.0.0-1ubuntu1.1
ii libunwind-14-dev:amd64 1:14.0.0-1ubuntu1.1
ii libunwind8:amd64 1.3.2-2build2.1
第二步:移除冲突的 libunwind-14-dev
bash
sudo apt remove libunwind-14-dev
系统提示将同时移除:
libc++-14-devlibc++-dev
确认移除操作(y),释放约 9,303 kB 磁盘空间。
第三步:安装标准 libunwind-dev
bash
sudo apt install libunwind-dev
成功安装后,输出:
Setting up libunwind-dev:amd64 (1.3.2-2build2.1)
第四步:安装 libgoogle-glog-dev
bash
sudo apt install libgoogle-glog-dev
自动安装依赖包:
libgflags2.2libgflags-devlibgoogle-glog0v5
安装成功!
完整解决方案总结
解决步骤
-
移除冲突包:
bashsudo apt remove libunwind-14-dev -
安装标准包:
bashsudo apt install libunwind-dev libgoogle-glog-dev
验证安装
bash
# 检查 glog 头文件
ls /usr/include/glog/logging.h
# 检查库文件
ls /usr/lib/x86_64-linux-gnu/libglog.so
# 重新配置 nvblox
cd ~/workspace/3rdparty/nvblox/nvblox/build
cmake .. -DPRE_CXX11_ABI_LINKABLE=ON -DBUILD_TESTING=OFF
替代方案(如果不想移除 LLVM 开发包)
方案一:从源码编译 glog
bash
git clone https://github.com/google/glog.git
cd glog
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
方案二:使用 Conda 安装(隔离环境)
bash
conda activate curobo
conda install -c conda-forge glog
注意事项
-
移除 libunwind-14-dev 的影响:
- 会同时移除
libc++-dev和libc++-14-dev - 如果项目依赖 LLVM 的 C++ 标准库,需要注意兼容性
- 会同时移除
-
系统环境:
- 本文基于 Ubuntu 22.04 (Jammy)
- CUDA 版本:12.8
- Conda 环境:curobo
-
后续优化:
bash# 清理不再需要的依赖 sudo apt autoremove
总结
通过移除冲突的 libunwind-14-dev 并安装系统标准的 libunwind-dev,成功解决了 libgoogle-glog-dev 的安装问题。这是一个典型的 Ubuntu 包管理依赖冲突案例,理解包之间的依赖关系是解决问题的关键。
对于使用 LLVM 工具链的开发环境,需要在项目需求之间做出权衡:要么接受移除 LLVM 相关包,要么选择源码编译或 Conda 安装等替代方案。