dpkg-divert: 错误: 删除 被 libnvidia-gl-470 转移的 /usr/lib/x86_64-linux-gnu/libGL.so.1 时 软件包名不匹配 发现了 nvidia-340 导致 /usr/lib/x86_64-linux-gnu/libGL.so.1 转移到 /usr/lib/x86_64-linux-gnu/libGL.so.1.distrib dpkg: 处理归档 /var/cache/apt/archives/libnvidia-gl-470_470.182.03-0ubuntu0.18.04.1_amd64.deb (--unpack)时出错: 新的 libnvidia-gl-470:amd64 软件包 pre-installation 脚本 子进程返回错误状态 2 在处理时有错误发生: /var/cache/apt/archives/libnvidia-gl-470_470.182.03-0ubuntu0.18.04.1_amd64.deb E: Sub-process /usr/bin/dpkg returned an error code (1)
时间: 2023-07-23 13:51:29 浏览: 455
这是一个关于 Ubuntu 操作系统中安装 Nvidia 显卡驱动时出现的错误信息。根据错误信息,似乎是由于系统中已经安装了旧版本的 Nvidia 驱动程序(nvidia-340),而新版本的驱动程序(libnvidia-gl-470)无法正确安装。为了解决这个问题,你可以尝试卸载旧版本的 Nvidia 驱动程序,再重新安装新版本的驱动程序。具体的操作可以参考 Nvidia 官方文档或者 Ubuntu 论坛上的相关帖子。
相关问题
ubuntu@ubuntu:~/PX4_Firmware$ make px4_sitl_default gazebo [0/6] Performing configure step for 'sitl_gazebo' -- install-prefix: /usr/local -- Using C++17 compiler -- Found Boost: /usr/include (found suitable version "1.65.1", minimum required is "1.58") found components: system thread filesystem chrono date_time atomic CMake Warning (dev) at /usr/share/cmake-3.25/Modules/FindPackageHandleStandardArgs.cmake:438 (message): The package name passed to `find_package_handle_standard_args` (PkgConfig) does not match the name of the calling package (gazebo). This can lead to problems in calling code that expects `find_package` result variables (e.g., `_FOUND`) to follow a certain pattern. Call Stack (most recent call first): /usr/share/cmake-3.25/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args) /usr/lib/x86_64-linux-gnu/cmake/gazebo/gazebo-config.cmake:30 (include) CMakeLists.txt:32 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. -- Found Boost: /usr/include (found suitable version "1.65.1", minimum required is "1.40.0") found components: thread system filesystem program_options regex iostreams date_time chrono atomic -- Found Protobuf: /usr/lib/x86_64-linux-gnu/libprotobuf.so;-lpthread (found version "3.0.0") -- Found Boost: /usr/include (found version "1.65.1") -- Looking for OGRE... -- Found Ogre Ghadamon (1.9.0) -- Found OGRE: optimized;/usr/lib/x86_64-linux-gnu/libOgreMain.so;debug;/usr/lib/x86_64-linux-gnu/libOgreMain.so -- Looking for OGRE_Paging... -- Found OGRE_Paging: optimized;/usr/lib/x86_64-linux-gnu/libOgrePaging.so;debug;/usr/lib/x86_64-linux-gnu/libOgrePaging.so -- Looking for OGRE_Terrain... -- Found OGRE_Terrain: optimized;/usr/lib/x86_64-linux-gnu/libOgreTerrain.so;debug;/usr/lib/x86_64-linux-gnu/libOgreTerrain.so -- Looking for OGRE_Property... -- Found OGRE_Property: optimized;/usr/lib/x86_64-linux-gnu/libOgreProperty.so;debug;/usr/lib/x86_64-linux-gnu/libOgreProperty.so -- Look
<think>好的,我现在需要解决用户提到的PX4 SITL Gazebo环境中出现的CMake警告,具体是关于find_package_handle_standard_args的pkgconfig不匹配的问题。首先,我得回忆一下这类警告通常是什么原因导致的。可能的情况包括依赖库版本不兼容、路径配置错误,或者系统中安装了多个版本的同一个库。
用户提到在构建时遇到CMake警告,提示pkgconfig不匹配。这通常意味着CMake在查找某个依赖包时发现了版本不一致的情况。比如,系统中有两个不同版本的某个库,或者CMake的查找路径指向了错误的版本。需要检查安装的依赖库是否符合PX4的要求,特别是那些通过apt或pip安装的包。
根据用户提供的引用内容,他们已经安装了一些依赖项,比如ninja-build、protobuf-compiler、libeigen3-dev等。但可能有些依赖项版本不对,或者缺少某些组件。例如,protobuf的版本可能过高或过低,或者eigen3没有正确安装。
接下来,我应该考虑如何验证这些依赖项的版本是否符合PX4的要求。可能需要查看PX4的官方文档,确认每个依赖的推荐版本。如果发现版本不匹配,可能需要通过apt降级或升级相应的包。此外,检查环境变量,确保CMake能够正确找到所需的库路径,避免多个版本冲突。
另外,用户提到的是Ubuntu系统,所以需要针对Ubuntu的包管理进行处理。使用apt-cache policy来查看已安装库的版本信息,确认是否有多个版本存在。如果有,可能需要卸载不需要的版本,或者使用update-alternatives来配置默认版本。
还有一个可能性是Python依赖的问题,用户安装了pip2和pip3的多个包,比如jinja2、numpy等。有时候Python包的版本冲突也会导致构建问题,尤其是在PX4的脚本中使用Python工具时。需要确保这些Python包版本与PX4兼容,可能需要使用虚拟环境来隔离依赖。
此外,检查PX4的构建日志,找到具体的警告信息,确定是哪个包导致的pkgconfig不匹配。例如,可能是protobuf、eigen3或gstreamer相关的包。然后针对性地解决该包的版本问题。
最后,建议用户清理构建目录,重新运行CMake,确保所有缓存被清除,避免旧的配置干扰。如果问题依旧,可能需要手动指定某些库的路径,或者在CMake命令中添加参数来忽略某些警告,但这只是临时解决方案,正确解决依赖版本才是根本。
总结步骤应该是:1. 检查依赖版本是否符合要求;2. 处理可能的多版本冲突;3. 确保Python依赖正确;4. 清理并重新构建。同时参考PX4官方文档和社区解决方案,比如用户提供的引用中的安装步骤,可能需要补充安装某些遗漏的包。</think>针对PX4 SITL Gazebo环境中出现的`find_package_handle_standard_args`相关CMake警告,通常由依赖库版本不匹配或路径配置问题导致。以下是分步解决方案:
---
### **步骤1:验证核心依赖版本**
1. **检查关键库的版本兼容性**
- 运行以下命令查看已安装版本:
```bash
apt-cache policy protobuf-compiler libeigen3-dev libgstreamer1.0-dev gazebo
```
- 对比PX4官方要求的版本(参考[PX4文档](https://docs.px4.io/main/en/dev_setup/dev_env_linux_ubuntu.html))。例如:
- `protobuf`建议版本为3.18.x
- `eigen3`需≥3.3.4
- `gazebo`需≥9.x(建议11.x)
2. **修复版本不匹配**
- 若版本过低,升级:
```bash
sudo apt upgrade protobuf-compiler libeigen3-dev
```
- 若版本过高,降级(以`protobuf`为例):
```bash
sudo apt install protobuf-compiler=3.18.0-1ubuntu1
```
---
### **步骤2:处理多版本冲突**
1. **检查系统中是否存在重复安装的库**
- 例如`libgstreamer`可能因开发包和运行时包冲突:
```bash
dpkg -l | grep gstreamer
```
- 卸载冗余包:
```bash
sudo apt remove libgstreamer-plugins-bad1.0-0
```
2. **配置CMake查找路径**
- 在CMake命令中指定正确路径(例如手动设置`EIGEN3_INCLUDE_DIR`):
```bash
cmake .. -DEIGEN3_INCLUDE_DIR=/usr/include/eigen3
```
---
### **步骤3:修复Python依赖**
1. **验证Python工具链版本**
- 确保`jinja2`、`empy`等包版本兼容(PX4要求`jinja2≥3.0`):
```bash
pip3 list | grep jinja2
```
- 升级不兼容的包:
```bash
pip3 install --upgrade jinja2 empy
```
2. **使用虚拟环境隔离依赖**
```bash
python3 -m venv px4_env
source px4_env/bin/activate
pip3 install -r requirements.txt
```
---
### **步骤4:清理并重新构建**
1. **清除旧构建缓存**
```bash
rm -rf build/px4_sitl_default
```
2. **重新生成构建配置**
```bash
make px4_sitl_default gazebo
```
---
### **补充说明**
- 若警告仍存在,检查完整CMake日志:
```bash
cat build/px4_sitl_default/CMakeCache.txt | grep "Mismatch"
```
- 对于特定库的路径问题,可通过`export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig`指定优先级[^1]。
---
检查发现默认不包含aarch64的标准头 echo | gcc -v -E - 2>&1 | grep "include" ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed" ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include /usr/local/include /usr/include # 1 "/usr/include/stdc-predef.h" 1 3 4
<think>好的,我现在需要分析用户的问题。用户之前询问过关于aarch64架构下GCC找不到stdint.h的问题,现在的新情况是,在x86_64架构的系统上执行`echo | gcc -v -E - 2>&1 | grep "include"`时,输出显示忽略了一些不存在的目录,特别是x86_64-redhat-linux相关的路径。用户提到“检查发现默认不包含aarch64的标准头”,但当前的输出显示的是x86_64架构的路径,这可能存在架构不匹配的问题。
首先,我需要理解用户的实际环境。用户可能是在x86_64的RedHat系统上尝试交叉编译aarch64架构的程序?或者可能误装了不同架构的GCC包?从输出中的路径来看,GCC是x86_64-redhat-linux版本4.8.5,而用户之前的问题涉及aarch64,这可能是问题的关键。
用户当前的GCC头文件搜索路径包含x86_64的目录,但忽略了aarch64的路径。这可能是因为用户安装了错误架构的GCC,或者在交叉编译环境中没有正确配置。需要确认系统是否安装了aarch64的交叉编译工具链,或者是否错误地安装了x86_64的GCC而期望使用aarch64的。
接下来,可能的解决步骤包括:
1. 检查系统架构:确认用户是在x86_64主机上尝试编译aarch64目标,还是误操作导致架构不匹配。
2. 安装正确的交叉编译工具链:如果目的是交叉编译,需要安装aarch64-linux-gnu-gcc和相关库。
3. 检查GCC版本兼容性:4.8.5版本较旧,可能存在兼容性问题,建议升级GCC或安装适合的版本。
4. 验证头文件路径:确保aarch64的头文件路径正确安装,并包含在GCC的搜索路径中。
用户可能混淆了不同架构的环境,导致GCC在错误的路径下查找头文件。需要引导用户正确配置交叉编译环境,或安装对应架构的开发包。同时,需要指出输出中的错误信息是关于x86_64路径不存在,这可能是因为残留的配置或错误的安装包导致的。</think>### 问题本质
您遇到的是 **跨架构头文件缺失问题**。从输出信息可以看出:
```bash
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/include"
```
说明当前系统存在 **x86_64架构的GCC环境残留**,但您实际需要的是 **aarch64架构的标准头文件**。
---
### 详细诊断流程
#### 1. 架构不匹配验证
执行以下命令确认系统架构:
```bash
# 查看当前系统架构
uname -m
# 查看GCC默认目标架构
gcc -dumpmachine
```
- **若输出`x86_64`**:说明当前是x86_64主机环境
- **若需要编译aarch64程序**:必须使用交叉编译工具链
#### 2. 交叉编译环境检查
检查是否安装正确的工具链:
```bash
# 查看aarch64工具链是否安装
ls /usr/bin/aarch64-linux-gnu-gcc*
# 查看多架构支持库
dpkg --print-foreign-architectures # Debian/Ubuntu
```
- **若未安装**:需要配置跨架构环境
---
### 解决方案
#### 方案一:安装完整交叉编译环境(推荐)
```bash
# Ubuntu/Debian
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# CentOS/RHEL
sudo yum install gcc-aarch64-linux-gnu
```
#### 方案二:修复头文件路径
```bash
# 创建符号链接(临时方案)
sudo ln -s /usr/aarch64-linux-gnu/include /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/aarch64-linux-gnu
# 验证链接
ls -l /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include | grep aarch64
```
#### 方案三:指定目标架构编译
```bash
# 显式指定目标架构
export CROSS_COMPILE=aarch64-linux-gnu-
make ARCH=arm64 CROSS_COMPILE=${CROSS_COMPILE}
```
---
### 关键配置验证
```bash
# 查看aarch64头文件是否存在
ls /usr/aarch64-linux-gnu/include/stdint.h
# 查看交叉编译器搜索路径
aarch64-linux-gnu-gcc -v -E - </dev/null 2>&1 | grep include
```
---
### 架构环境对比表
| 项目 | x86_64原生环境 | aarch64交叉编译环境 |
|------|----------------|---------------------|
| 编译器路径 | `/usr/bin/gcc` | `/usr/bin/aarch64-linux-gnu-gcc` |
| 标准头文件路径 | `/usr/include` | `/usr/aarch64-linux-gnu/include` |
| 库文件路径 | `/usr/lib/x86_64-linux-gnu` | `/usr/aarch64-linux-gnu/lib` |
| 典型错误 | 找不到跨架构头文件 | 链接时库文件不匹配 |
---
### 典型修复案例
某嵌入式开发者在x86_64主机上的修复过程:
1. 清除残留配置:
```bash
sudo apt remove gcc-4.8-x86_64-linux-gnu
```
2. 安装完整工具链:
```bash
sudo apt install gcc-10-aarch64-linux-gnu
```
3. 验证环境:
```bash
aarch64-linux-gnu-gcc -v 2>&1 | grep Target
# 输出:Target: aarch64-linux-gnu
```
建议优先使用方案一建立干净的交叉编译环境,这是最可靠的长期解决方案。如果仍遇到路径问题,可通过`-I`参数显式指定头文件路径:
```bash
CFLAGS="-I/usr/aarch64-linux-gnu/include" make
```
阅读全文
相关推荐

















