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

【Linux应用】交叉编译环境配置、ARM虚拟机环境编译,以及最简单粗暴的环境移植(直接从目标板上复制)

【Linux应用】交叉编译环境配置、ARM虚拟机环境编译,以及最简单粗暴的环境移植(直接从目标板上复制)

文章目录

  • 交叉编译器
  • ARM虚拟机环境下“交叉编译”
  • 含有三方库的交叉编译
  • 直接从目标板上复制编译环境
    • 编写cmake
    • 验证环境完备
    • 编译
    • 编译时VTK报错
    • 完整的CMakeLists.txt
  • 动态库glibc库不一致报错
    • 方法1
    • 方法2
  • 附录:开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)
    • ZERO 3烧录
    • ZERO 3串口shell
    • 外设挂载
    • 连接WiFi
    • SSH连接
    • SSH的文件交互
    • 换源

交叉编译器

由于内核架构不同 指令集不同 在PC(x86架构)上编译的代码无法直接在ARM上运行
为了能够在PC上编译ARM架构的可执行程序 那么就需要用到交叉编译器
通常在PC的Linux平台下进行交叉编译
大多数Linux设备都为aarch内核 目前大部分为64位系统 所以就要安装aarch64的交叉编译器

# 查看可以安装的版本
apt-cache search aarch64
# 选择可以安装的版本进行安装
# 此处选择gcc-5-aarch64-linux-gnu以及g++-5-aarch64-linux-gnu进行安装
sudo apt-get install gcc-5-aarch64-linux-gnu 
sudo apt-get install g++-5-aarch64-linux-gnu
# 安装依赖
sudo apt --fix-broken install
# 安装一个没有版本号的gcc和g++
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu
# 查看版本
aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v

一般来说 直接运行以下即可:

# 安装一个没有版本号的gcc和g++
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu
# 查看版本
aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v

安装后 可以查看所在位置

~$ whereis aarch64-linux-gnu-gcc
aarch64-linux-gnu-gcc: /usr/bin/aarch64-linux-gnu-gcc /usr/share/man/man1/aarch64-linux-gnu-gcc.1.gz

当使用cmake时 可以直接使用set CMAKE_C_COMPILERCMAKE_CXX_COMPILER 指定编译器
如:

cmake_minimum_required(VERSION 3.10)
set (CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
set (CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
project(main) 
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")  
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")  
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
include_directories (${PROJECT_SOURCE_DIR}/include)
aux_source_directory(src SRC_LIST)
add_executable(main ${SRC_LIST}) 

ARM虚拟机环境下“交叉编译”

如果在ARM虚拟机上编译的话 就不要安装原本运行在PC上的交叉编译器了
而是应该安装ARM本身的编译器
譬如:

#C++编译环境
sudo apt-get install -y cmake
sudo apt-get install -y g++ build-essentialsudo apt-get install -y libopencv-dev #OPENCV库 4.5.1
sudo apt-get install -y libpcl-dev #PCL库 1.11.1

在这里插入图片描述
这样一来 其实严格意义上而言都不叫“交叉编译”了

交叉编译实际上是在PC的x86架构上运行支持交叉编译的编译器 然后编译成目标架构
其交叉编译器只能在PC上运行 但编译出来的文件只能在目标架构上运行

所以 在ARM环境上编译出ARM的程序 那么所用的编译器就不是交叉编译器了 所以直接安装g++即可
但如果在PC环境下安装g++ 则只能编译出在PC上运行的程序 如果要编译ARM程序 则需要交叉编译器如aarch64-g+±linux等

如果想直接运行ARM虚拟机编译 可以参考:
【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)

含有三方库的交叉编译

配置了相关交叉编译后 即可通过编译器编译出适合ARM平台运行的程序
但若需要链接一些三方库 则需要另外配置编译环境

譬如链接了opencv库 则就需要将opencv源码下载下来 用交叉编译器编译一遍 然后再编译使用该库的工程

一般需要用到cmake来编译opencv这些三方库

sudo apt install cmake
sudo apt-get install cmake-gui

编译opencv:

cd your opencv dir
unzip opencv-4.6.0.zip
unzip opencv_contrib-4.6.0.zip
cd opencv-4.6.0unzip .cache.zip  #将.cache解压到opencv-4.6.0下mkdir build
mkdir build/aarch64_1
mkdir install
mkdir install/aarch64_1
cd build/aarch64_1

安装依赖包:

#安装一些依赖
sudo apt install cmake git libavcodec-dev libavformat-dev libswscale-dev \
python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev \
libjasper-dev libdc1394-22-dev 
sudo apt install libgtk2.0-dev
sudo apt install pkg-config

设置cmakelist

# 设置目标系统信息
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)# 设置交叉编译工具链路径
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)# 设置根文件系统路径
set(CMAKE_SYSROOT /path/to/your/sysroot)# 设置查找规则
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

执行cmake:

mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-linux-gnu.toolchain.cmake \-D WITH_OPENCL=OFF \-D WITH_CUDA=OFF \-D BUILD_TESTS=OFF \-D BUILD_PERF_TESTS=OFF \-D BUILD_opencv_python2=OFF \-D BUILD_opencv_python3=OFF \../opencv

编译:

make -j$(nproc)
make install

生成相关opencv交叉编译文件后 就可以在工程中导入
但这种方式比较繁琐

直接从目标板上复制编译环境

另外还有一种方式 就是直接复制编译环境
可以先在目标板上装一个编译器 编译一下opencv
然后再把整个环境复制过来
需要从开发板获取的内容:
譬如用到了PCL和opencv库:

/usr/lib/aarch64-linux-gnu/ #下的所有OpenCV/PCL相关.so文件和符号链接
/usr/include/opencv4/ #头文件目录
/usr/lib/cmake/ #下的CMake配置文件
/usr/include/pcl-1.11/ #PCL头文件

在开发板上执行以下命令可以看到这两个库的依赖

dpkg -l | grep -E 'opencv|pcl|boost' > deps_list.txt

在这里插入图片描述
超级多

所以还不如干脆直接整个文件夹都拷过来
这里将上诉文件夹下的所有文件都进行了拷贝,以防止缺少依赖等情况的发生。
包括aarch64-linux-gnu和include、cmake目录全部进行了完整的拷贝。

也就是usr目录下的include文件夹 和 lib目录下的编译器以及cmake文件夹

在这里插入图片描述
可以将其放到一个目录下 如radxa/boot 然后将这个目录放到Linux环境的某个目录 比如 /home/ubuntu/radxa/boot

编写cmake

在cmake中 除了指定交叉编译器外
还需要指定各个库的链接文件所在位置
如:

# 设置查找规则
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)# 依赖包配置路径
set(OpenCV_DIR "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4")
set(PCL_DIR "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/pcl")# 手动配置Boost路径
include_directories("${CMAKE_SYSROOT}/usr/include")
link_directories("${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu")

验证环境完备

首先就是保证以下文件都存在:

# 检查OpenCV核心库
ls /home/ubuntu/radxa/boot/usr/lib/aarch64-linux-gnu/libopencv_core.so# 验证PCL公共库
ls /home/ubuntu/radxa/boot/usr/lib/aarch64-linux-gnu/libpcl_common.so# 检查头文件存在性
ls /home/ubuntu/radxa/boot/usr/include/opencv4/opencv2/core.hpp
ls /home/ubuntu/radxa/boot/usr/include/pcl-1.11/pcl/point_cloud.h

然后通过cmake验证:

# 在build目录下查看配置信息
cat CMakeCache.txt | grep -E "OpenCV|PCL"# 查看OpenCV版本
cat CMakeCache.txt | grep OpenCV_VERSION

查看输出的路径是否完备
在这里插入图片描述

当然 如果能顺利通过 那就写一个demo程序编译验证最好

编译

cmake写好了以后 编译时 则指定SYSROOT目录:

cmake .. -DCMAKE_SYSROOT=/home/ubuntu/radxa/boot

当然 也可以直接在cmakelists中指定相关的路径
包括:

set(CMAKE_SYSROOT "/home/ubuntu/radxa/boot")  # 设置查找规则
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)# 依赖包配置路径
set(OpenCV_DIR "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4")
set(PCL_DIR "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/pcl")# 手动配置Boost路径
include_directories("${CMAKE_SYSROOT}/usr/include")
link_directories("${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu")# 包含目录配置
include_directories(${OpenCV_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}"${CMAKE_SYSROOT}/usr/include/eigen3""${CMAKE_SYSROOT}/usr/include/pcl-1.11"${CMAKE_CURRENT_SOURCE_DIR}
)

同时也别忘记添加cmake的查包函数

# 查找依赖包
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED COMPONENTS common io)
find_package(Threads REQUIRED)# 链接目录配置
link_directories(${PCL_LIBRARY_DIRS})

配置成功后 使用cmake指令直接就能编译

在这里插入图片描述
编译成功后 相关生成的参数、makefile就会在build中创建
直接make即可

编译时VTK报错

由于PCL导入了VTK库 所以还要增加VTK库的路径选择:

# 设置VTK路径
set(VTK_DIR "${CMAKE_SYSROOT}/usr/lib/cmake/vtk-7.1")  # 新增VTK配置路径
find_package(VTK REQUIRED)  # 添加VTK查找
include_directories("${CMAKE_SYSROOT}/usr/include/vtk-7.1")  # 新增手动包含路径# 包含目录配置
include_directories(${VTK_INCLUDE_DIRS}  # 新增VTK头文件包含"${CMAKE_SYSROOT}/usr/include/vtk-7.1"  # 防御性添加${OpenCV_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}"${CMAKE_SYSROOT}/usr/include/eigen3""${CMAKE_SYSROOT}/usr/include/pcl-1.11"${CMAKE_CURRENT_SOURCE_DIR}
)# 目标链接配置
target_link_libraries(PCN${VTK_LIBRARIES}  # 新增VTK库链接${OpenCV_LIBS}${PCL_LIBRARIES}Threads::Threadsboost_filesystem  # 直接链接库文件dlpthreadrt"-Wl,--rpath-link=${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu"
)

完整的CMakeLists.txt

cmake_minimum_required(VERSION 3.0)# 交叉编译基础配置(必须放在project()前)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
set(CMAKE_SYSROOT "/home/ubuntu/radxa/boot")  # 修正路径拼写错误project(PCNav)# 设置VTK路径
set(VTK_DIR "${CMAKE_SYSROOT}/usr/lib/cmake/vtk-7.1")  # 新增VTK配置路径
find_package(VTK REQUIRED)  # 添加VTK查找
include_directories("${CMAKE_SYSROOT}/usr/include/vtk-7.1")  # 新增手动包含路径# 设置查找规则
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)# 依赖包配置路径
set(OpenCV_DIR "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4")
set(PCL_DIR "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/pcl")# 标准配置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 编译选项
option(DEBUG_BUILD "Build with debug information" OFF)
if(DEBUG_BUILD)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")
else()set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
endif()# 查找依赖包
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED COMPONENTS common io)
find_package(Threads REQUIRED)# 手动配置Boost路径
include_directories("${CMAKE_SYSROOT}/usr/include")
link_directories("${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu")# 包含目录配置
include_directories(${VTK_INCLUDE_DIRS}  # 新增VTK头文件包含"${CMAKE_SYSROOT}/usr/include/vtk-7.1"  # 防御性添加${OpenCV_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}"${CMAKE_SYSROOT}/usr/include/eigen3""${CMAKE_SYSROOT}/usr/include/pcl-1.11"${CMAKE_CURRENT_SOURCE_DIR}
)# 链接目录配置
link_directories(${PCL_LIBRARY_DIRS})# 源文件配置
set(PCN_SOURCESPCN.cppnavigationProcess.cppopencvTool.cpppointCloudTools.cppsensorData.cpptoFlightControl.cpp
)set(MAIN_SOURCES main.cpp)
set(HEADERS PCN.h)# 构建目标
add_library(PCN SHARED ${PCN_SOURCES} ${HEADERS})# 目标链接配置
target_link_libraries(PCN${VTK_LIBRARIES}  # 新增VTK库链接${OpenCV_LIBS}${PCL_LIBRARIES}Threads::Threadsboost_filesystem  # 直接链接库文件dlpthreadrt"-Wl,--rpath-link=${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu"
)add_executable(PCNav ${MAIN_SOURCES})
target_link_libraries(PCNav PCN)# 并行编译配置
include(ProcessorCount)
ProcessorCount(N)
if(NOT N EQUAL 0)set(CMAKE_BUILD_PARALLEL_LEVEL ${N})
endif()

动态库glibc库不一致报错

如果编译的是静态文件 那么编译成功后就可以直接运行
但如果编译的是动态库
那么就需要考虑编译器版本是否一致 且glibc库是否一致

编译器版本可以在目标板上执行编译器版本命令进行获取
在这里插入图片描述

在编译器目录下执行命令:

sudo ./libc.so.6

可以查看libc版本

在这里插入图片描述
这里就可以获取到版本信息为GCC 10.2.1 + GLIBC 2.31

方法1

直接修改编译成静态库
设置为静态库编译 然后就会发现需要很多依赖 一个一个链接(超大工作量)

方法2

那么在PC的交叉环境中就要安装对应的编译器(有些环境可能没有):

# 添加 Debian 11 (bullseye) 的仓库源(该版本包含所需工具链)
sudo tee /etc/apt/sources.list.d/debian-bullseye.list <<EOF
deb [arch=amd64] http://deb.debian.org/debian bullseye main
deb [arch=amd64] http://deb.debian.org/debian-security bullseye-security main
EOF# 启用多架构支持并安装工具链
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt install -y \gcc-10-aarch64-linux-gnu \g++-10-aarch64-linux-gnu \libc6-arm64-cross=2.31-13+deb11u11 \libc6-dev-arm64-cross=2.31-13+deb11u11# 验证版本
aarch64-linux-gnu-gcc-10 -v  # 应显示 gcc version 10.2.1
aarch64-linux-gnu-readelf -a /usr/aarch64-linux-gnu/lib/libc.so.6 | grep 'GNU C Library'  # 应显示 2.31

但是 多半会安装失败 提示未找到对应版本的库文件

那么就可以手动下载:

# 进入临时目录
mkdir -p ~/temp_cross && cd ~/temp_cross# 从清华镜像站下载指定版本(适用于Debian 11 bullseye)
wget https://mirrors.tuna.tsinghua.edu.cn/debian/pool/main/g/glibc/libc6-arm64-cross_2.31-13+deb11u11_all.deb
wget https://mirrors.tuna.tsinghua.edu.cn/debian/pool/main/g/glibc/libc6-dev-arm64-cross_2.31-13+deb11u11_all.deb# 安装软件包
sudo dpkg -i libc6-arm64-cross_2.31-13+deb11u11_all.deb
sudo dpkg -i libc6-dev-arm64-cross_2.31-13+deb11u11_all.deb# 安装主编译器(此时应该可以正常找到依赖)
sudo apt install -y gcc-10-aarch64-linux-gnu g++-10-aarch64-linux-gnu# 清理安装包
rm libc6-*-cross_*.deb

强制安装配置:

# 修复依赖关系
sudo apt --fix-broken install# 设置候选版本(确保后续更新不会覆盖)
sudo apt-mark hold libc6-arm64-cross libc6-dev-arm64-cross

安装后即可重新编译

附录:开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

ZERO 3烧录

ZERO 3有两种 最本质的就是一个带WiFi一个不带WiFi
在这里插入图片描述

ZERO 3作为一个Linux板 其存储支持从sd卡EFI启动

系统安装则直接通过Balena Etcher来进行
可以使用其Windows版本即可
官方文档:
官方文档快速上手描述

镜像下载则也可以使用官方镜像:
Radxa ZERO 3 Debian Build 6

该镜像是最初的镜像 很多依赖都没有
如果开发的话 可以直接下载第三方镜像 或者自己在原有官方镜像上去安装镜像包等等

烧录很简单 直接用工具选择U盘 选择镜像即可

下图为烧录好了的sd卡
在这里插入图片描述
除了系统分区外 就是一个config分区 其挂载根根目录名称即为config

在这里插入图片描述

ZERO 3串口shell

串口与ZERO 3链接如下图:
在这里插入图片描述
链接后 配置串口为

baudrate: 1500000
data bit: 8
stop bit: 1
parity  : none
flow control: none

启动后 用户名和密码都为radxa
在这里插入图片描述

外设挂载

根据df命令查询系统挂载点
在这里插入图片描述
其做好了的U盘外部存储空间为/config
在这里插入图片描述

连接WiFi

使用如下指令链接WiFi:

nmcli device wifi                                           #扫描WiFi
sudo nmcli device wifi connect <ssid> password <passwd>     #连接WiFi

在这里插入图片描述
连上后 使用ip a命令即可查看连接状态和ip
在这里插入图片描述

SSH连接

使用命令sudo systemctl status ssh查看ssh状态在这里插入图片描述
前提是要安装ssh
如果没有安装 则通过shell安装ssh:

sudo apt-get update
sudo apt-get install openssh-server openssh-sftp-server

根据Active判断是否需要重启ssh服务:
重启ssh服务:

sudo systemctl restart ssh

启动后如下:
在这里插入图片描述
Active状态就被设置为了running

开机自启动ssh则使用命令:

sudo systemctl enable --now ssh

在PC上 支持ssh的设备中 使用以下指令链接到板子:

ssh [username]@[IP address] # or ssh [username]@[hostname]

如下图:
在这里插入图片描述

SSH的文件交互

若是在PC上作为主机去访问设备
那么就是在PC的cmd中运行shell

有的终端软件配备了ssh的文件管理传输功能
在这里插入图片描述
连上以后就可以直接搜素到当前目录下的各类文件 以便于实现文件管理
并且可以直接download
在这里插入图片描述

# 复制 Windows 文件到 Linux
scp D:\data\1.txt root@192.168.88.161:/root/data
# 复制 Windows 目录到 Linux(记得加 -r)
scp -r D:\data root@192.168.88.161:/root/data# 复制 Linux 文件到 Windows
scp root@192.168.88.161:/root/data/1.txt D:\data
# 复制 Linux 目录到 Windows(记得加 -r)
scp -r root@192.168.88.161:/root/data D:\data

前提是设备开启了ssh可以被链接
在这里插入图片描述
发过去后便能在板子上看到:
在这里插入图片描述

回传文件夹:
在这里插入图片描述
在这里插入图片描述

如果是Linux设备去连接Windows设备 则需要在Windows里面设置对应的服务 相关教程很多 这里不过多赘述

如果是Linux设备访问Linux设备 则主设备也要指定IP

scp root@192.168.88.161:/root/1.txt root@192.168.88.162:/root# 如果设置了Linux之间的免密登录,可这样写:
scp 192.168.88.161:///root/1.txt 192.168.88.162:///root

换源

Linux系统的源都在/etc/apt/下 一般有两个文件
一个是sources.list 另外一个是sources.list.d目录下的品牌list文件

如树莓派需要备份原本的源:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak

而radxa的则是:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo cp /etc/apt/sources.list.d/radxa.list /etc/apt/sources.list.d/radxa.list.bak

将原本的文件进行编辑:

sudo nano /etc/apt/sources.list

注释掉最初的源 并添加新的源:

deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free-firmware

如图:
在这里插入图片描述
然后再换子目录下的源

sudo nano /etc/apt/sources.list.d/raspi.list

替换成:

deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

不过很可惜 清华源没有radxa 但是可以换debian的源(/etc/apt/sources.list):

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free

换源后 执行

sudo apt-get upgrade
sudo apt-get update

http://www.mrgr.cn/news/100696.html

相关文章:

  • 9.idea中创建springboot项目
  • python脚本下载ERA5数据详细规范和教程
  • day006
  • phpstudy修改Apache端口号
  • 基于FFmpeg命令行的实时图像处理与RTSP推流解决方案
  • KenticoCMS 文件上传导致xss漏洞复现(CVE-2025-2748)
  • Linux CentOS 7 安装Apache 部署html页面
  • [stm32] 4-1 USART(1)
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)
  • 【Prometheus-Postgres Exporter安装配置指南,开机自启】
  • Shopify网上商店GraphQL Admin接口查询实战
  • IAP远程升级入门讲解
  • 对 FormCalc 语言支持较好的 PDF 编辑软件综述
  • 十五种光电器件综合对比——《器件手册--光电器件》
  • Linux环境变量以及进程虚拟地址原理
  • WPF之Button控件详解
  • Vue 中的过渡效果与响应式数据:transition、transitiongroup、reactive 和 ref 详解
  • 【Prometheus-Mongodb Exporter安装配置指南,开机自启】
  • 2025运维工程师面试题1(答案在后一张)
  • CSS:编写位置分类及优先级