Cross-Compile QT 5.15.9

  • 0 . 交叉编译Qt6
    • 0.1 使用源码编译cmake
    • 0.2 安装 Node.js (14或以上)和 npm
    • 0.3 Host安装依赖包和CMake
    • 0.4 Target安装依赖包
    • 0.5 同步sysroot符号链接
    • 0.6 编译Qt应用
  • 1. 安装依赖包
    • 0.3 配置Qt交叉编译环境
    • 1.1 Host安装依赖包
    • 1.2 Target安装依赖包
    • 1.3 把Target系统文件同步到Host sysroot目录
    • 1.4 同步sysroot中的符号链接
  • 2. 配置Qt
    • 2.1 创建build目录
    • 2.2 配置、编译Qt源码
    • 2.3 编译Qt
    • 2.4 安装Qt
  • 3. 布署Qt到target 板
  • 4. 在QtCreator中设置交叉编译环境
    • 4.1 运行
  • 5. 修改系统配置
    • 5.1 修改静态IP配置
    • 5.2 修改DHCP配置
    • 5.3 修改MAC地址配置
    • 5.4 使用命令连接WiFi
    • 5.5 自启动配置
    • 5.6 查看芯片运行状态
  • 6. 常用工具
    • 6.1 Target与电脑端文件传输
    • 6.2 IAR调试信息
    • 6.4 linuxfb
    • 6.5 Target Error
      • 6.5.1 非UTF-8
  • 参考链接

0 . 交叉编译Qt6

  • 参考1
  • 参考2
  • 参考3Cross-Compile Qt 6 for Raspberry Pi

0.1 使用源码编译cmake

  • 参考2
sudo apt install libssl-dev
git clone https://github.com/Kitware/CMake.git
cd CMake
./bootstrap && make && sudo make install

0.2 安装 Node.js (14或以上)和 npm

  • 参考

0.3 Host安装依赖包和CMake

  • 依赖包
# 安装依赖包
sudo apt-get install make build-essential libclang-dev ninja-build gcc git bison python3 gperf pkg-config libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev# Qt TextToSpeech
sudo apt install libspeechd-dev flite1-dev libasound2-dev# multimedia
sudo apt install libavcodec-dev libavformat-dev libavfilter-dev libavdevice-dev# bluetooth
sudo apt install libpcsclite-dev libbluetooth-dev
  • cmake
cmake ../qt-everywhere-src-6.5.0/ -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DQT_BUILD_EXAMPLES=OFF \
-DQT_BUILD_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=/home/am/installed/qt6-host \
--log-level=VERBOSE

0.4 Target安装依赖包

  • 升级系统
sudo apt update
sudo apt upgrade
sudo reboot
  • 查找指定文件属于哪个包
dpkg-query --search /usr/include/brotli/decode.h
  • 安装裁剪完整依赖包
sudo apt install -y libboost1.71-all-dev libudev-dev libinput-dev libts-dev \
libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev \
libglib2.0-dev libpulse-dev libsnappy-dev libnss3-dev flex bison libxslt-dev \
ruby gperf libbz2-dev libcups2-dev libfreetype6-dev libicu-dev libsqlite3-dev \
libavcodec-dev libavformat-dev libavfilter-dev libavdevice-dev  libswscale-dev \
libspeechd-dev flite1-dev libasound2-dev libpcsclite-dev libbluetooth-dev \
libxcursor-dev libxcomposite-dev libaudio-dev rsync libbrotli-dev libxrandr-dev
  • 安装完整依赖包
# 安装依赖包1
sudo apt-get install libboost-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev libasound2-dev libpulse-dev gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  gstreamer1.0-alsa libvpx-dev libsrtp2-dev libsnappy-dev libnss3-dev "^libxcb.*" flex bison libxslt-dev ruby gperf libbz2-dev libcups2-dev libatkmm-1.6-dev libxi6 libxcomposite1 libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev# 安装依赖包2
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libx11-dev freetds-dev libsqlite3-dev libpq-dev libiodbc2-dev firebird-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev libxkbcommon-x11-dev# 安装TTS Engine
sudo apt install libspeechd-dev flite pulseaudio libpulse-dev osspd
# 安装rsync用于与Host执行rsync
sudo apt install -y rsync
# 删除不需要的包
sudo apt remove libzstd-dev libharfbuzz-bin libharfbuzz-dev
  • cmake
cmake ../qt-everywhere-src-6.5.0/ -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DQT_BUILD_EXAMPLES=OFF \
-DQT_BUILD_TESTS=OFF \
-DQT_HOST_PATH=$HOME/installed/qt6-host \
-DCMAKE_STAGING_PREFIX=$HOME/installed/qt6-x3 \
-DCMAKE_INSTALL_PREFIX=/usr/local/qt6-x3 \
-DCMAKE_TOOLCHAIN_FILE=$HOME/tools/toolchain.cmake \
-DQT_QMAKE_TARGET_MKSPEC=linux-aarch64-gnu-g++ \
-DFEATURE_optimize_size=ON \
-DINPUT_opengl=no \
-DFEATURE_linuxfb=ON \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_qtwayland=OFF \
-DBUILD_qtwebchannel=OFF \
-DBUILD_qtwebengine=OFF \
-DBUILD_qtwebview=OFF \
-DBUILD_qtdoc=OFF

0.5 同步sysroot符号链接

sudo apt install symlinks
symlinks -rc sysroot
  • 修正dbus链接
cd /home/am/installed/sysroot/usr/lib/aarch64-linux-gnu
rm libdbus-1.so
ln -s libdbus-1.so.3.19.11 libdbus-1.so

0.6 编译Qt应用

  • 编译
$ cd ~/qt5/qtbase/examples/gui/analogclock/
$ ls ## make sure there is a CMakeLists.txt file
$ ~/qt-raspi/bin/qt-cmake CMakeLists.txt
# or
$ mkdir build; cd build;
$ qt-cmake ..### CMake is configuring here. After it is done without any error, we can proceed to build and install it
$ cmake --build . --parallel 4
# or
$ make$ cmake --install .
  • 拷贝到板子上运行
$ scp -r gui_analogclock <pi_username>@<pi_ip_address>:/home/pi
$ ssh <pi_username>@<pi_ip_address>
$ cd ~ ## or cd to the directory where you send the binary
$ ./gui_analogclock

1. 安装依赖包

  • 依赖包列表文档

0.3 配置Qt交叉编译环境

  • 给一个设备交叉编译Qt需要以下两个工具:
  • toolchain
    • 包含编译器、头文件和相关的库
  • sysroot
    • 包含目标系统的头文件和库,允许在主机上编译、链接库和应用程序。

1.1 Host安装依赖包

sudo apt-get install build-essential gcc g++ gperf bison flex texinfo help2man make libncurses5-dev libisl-dev autoconf automake libtool libtool-bin gawk wget bzip2 xz-utils unzip patch curl libstdc++6 m4 binutils dh-autoreconf libcunit1-ncurses libexpat1-dev python-dev sudo zsh rsync vim cmake ninja-build libxkbcommon0 libgl1-mesa-dev libfontconfig1-dev libdbus-1-dev nodejs libxcb-xinerama0

1.2 Target安装依赖包

  • Target的依赖包将通过rsync同步到Host的sysroot目录下,以提供QT cross compile时所需要的依赖库
  • pkg-config检查dbus-1是否安装
pkg-config --libs --cflags dbus-1
  • 安装Plugin依赖库
sudo apt install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxkbcommon-dev libxkbcommon-x11-dev
  • 安装Accessibility 依赖库
sudo apt install libatspi2.0-dev
  • 安装Speech 依赖库
sudo apt install flite1-dev libspeechd-dev speech-dispatcher
  • 安装OpenGL依赖库
# 使用  -no-opengl选项 disable OpenGL
  • 安装 Qt WebEngine 插件
sudo apt install libdbus-1-dev libfontconfig1-dev libdrm-dev libxcomposite-dev libxcursor-dev libxi-dev libxrandr-dev  libxtst-dev

1.3 把Target系统文件同步到Host sysroot目录

  • 同步示例:
rsync -avz --rsync-path="sudo rsync" --delete pi@192.168.1.7:/usr/lib sysroot/usr
  • The –rsync-path=“sudo rsync” option allows us to access files on the target system that may require elevated rights.
  • The –delete option will delete any files from our host system if they have also been deleted on the target system.
# create sysroot
mkdir /home/am/nfs/sysroot; mkdir /home/am/nfs/sysroot/usr
cd /home/am/nfs#  rsync system files from target to PC
rsync -avz root@192.168.1.12:/lib sysroot
rsync -avz root@192.168.1.12:/usr/include sysroot/usr
rsync -avz root@192.168.1.12:/usr/lib sysroot/usr
# or
rsync -avz --rsync-path="sudo rsync"  root@192.168.1.12:/lib sysroot
rsync -avz --rsync-path="sudo rsync"  root@192.168.1.12:/usr/include sysroot/usr
rsync -avz --rsync-path="sudo rsync"  root@192.168.1.12:/usr/lib sysroot/usr

1.4 同步sysroot中的符号链接

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

2. 配置Qt

  • 下载Qt源码

    • https://download.qt.io/archive/qt/

2.1 创建build目录

mkdir build; cd build

2.2 配置、编译Qt源码

  • png:使用系统的png
  • qt-png:使用QT中的png
  • 查看配置选项及说明
../qt-everywhere-src-5.15.9/configure --help
  • 配置编译选项
../qt-everywhere-src-5.15.9/configure \
-prefix /usr/local/qt5.15.9 \
-extprefix /home/am/install/qt5.15.9 \
-recheck-all \
-release \
-opensource \
-confirm-license \
-pkg-config \
-xplatform linux-aarch64-gnu-g++ \
-sysroot /home/am/nfs/sysroot \
-optimize-size \
-qt-pcre \
-qt-sqlite \
-iconv \
-syslog \
-qt-freetype \
-qt-harfbuzz \
-no-opengl \
-linuxfb \
-gif \
-qt-libpng \
-qt-libjpeg \
-zlib \
-qt-assimp \
-qt-tiff \
-qt-webp \
-nomake tests \
-nomake examples \
-make libs \
-skip qtlocation \
-skip qtscript \
-skip qtwayland \
-skip qtwebengine \
-skip qtdoc \
-flite

2.3 编译Qt

make -j4

2.4 安装Qt

make install

3. 布署Qt到target 板

  • 拷贝Qt安装文件
cd /home/am/install
rsync -avz --rsync-path="sudo rsync" qt5.15.9 root@192.168.1.12:/usr/local
  • 更新Linker (以让Targer linker找到Qt库文件)
echo /usr/local/qt5.15.9/lib | sudo tee /etc/ld.so.conf.d/qt5.15.9.conf
sudo ldconfig

4. 在QtCreator中设置交叉编译环境

  • 在QtCreator中设置交叉编译环境
  • 下载在线安装器安装Qt Creator
    • https://download.qt.io/official_releases/online_installers/
  • 下载Qt Creator安装包
    • https://download.qt.io/official_releases/qtcreator/

4.1 运行

  • 在目标板上找不到工具链中的.so
sudo vim /etc/ld.so.conf.d/toolchain.conf
# 把找不到.so所在的路径copy到上面的toolchain.conf中
sudo ldconfig
  • 设置 QT_QPA_PLATFORM
#错误信息:
#qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in ""
#This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
#Available platform plugins are: linuxfb, minimal, offscreen, vnc.
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920x1080:mmsize=1920x1080:offset=0x0:nographicsmodeswitch=0

5. 修改系统配置

5.1 修改静态IP配置

  • 静态网络配置保存在/etc/network/interfaces文件中,通过修改address、netmask、gateway等字段,可完成对静态IP配置的修改
sudo vim /etc/network/interfaces
  • 配置文件内容如下:
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto eth0
iface eth0 inet staticaddress 192.168.3.100netmask 255.255.255.0gateway 192.168.3.1 metric 700
  • 修改完成后,命令行输入以下命令让配置生效
sudo restart_network

5.2 修改DHCP配置

  • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。开发板的DHCP网络配置保存在/etc/network/interfaces文件,通过修改eth0相关配置,可完成对DHCP模式的修改
sudo vim /etc/network/interfaces
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcpmetric 700
  • 修改完成后,命令行输入以下命令让配置生效
sudo restart_network

5.3 修改MAC地址配置

  • 如需修改开发板默认MAC地址,可通过在/etc/network/interfaces文件中增加pre-up配置信息,指定用户需要的MAC地址
sudo vim /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto eth0
iface eth0 inet staticaddress 192.168.3.100netmask 255.255.255.0gateway 192.168.3.1 pre-up ifconfig eth0 hw ether 00:11:22:9f:51:27
  • 修改完成后,命令行输入以下命令让配置生效
sudo restart_network

5.4 使用命令连接WiFi

  • 扫描热点
sudo nmcli device wifi rescan
  • 列出扫描到的热点
sudo nmcli device wifi list
  • 连接WiFi
sudo wifi_connect "SSID" "PASSWD"

5.5 自启动配置

  • 通过在sudo vim /etc/rc.local文件末尾添加命令,可实现开机自启动功能,例如:
#!/bin/bash -e
#
# rc.local
#re
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.#!/bin/shchmod a=rx,u+ws /usr/bin/sudo
chown sunrise:sunrise /home/sunrisewhich "hrut_count" >/dev/null 2>&1
if [ $? -eq 0 ]; thenhrut_count 0
fi# Insert what you need

5.6 查看芯片运行状态

sudo hrut_somstatus

6. 常用工具

6.1 Target与电脑端文件传输

  • 拷贝单文件 local_file 到target /userdata目录下:
scp local_file root@192.168.3.100:/userdata/
  • 拷贝整个文件夹 local_folder 到target /userdata目录下:
scp -r local_folder root@192.168.3.100:/userdata/

6.2 IAR调试信息

  • 查看IAR调试信息:
cat /sys/kernel/debug/iar

6.4 linuxfb

  • This linuxfb plugin writes directly to the framebuffer. Only software-rendered content is supported. Note that on some setups the display performance is expected to be limited.
  • The linuxfb plugin allows specifying additional settings by passing them in the QT_QPA_PLATFORM environment variable or -platform command-line option. For example, QT_QPA_PLATFORM=linuxfb:fb=/dev/fb1 specifies that the framebuffer device /dev/fb1 must be used instead of the default fb0. Multiple settings can be specified by separating them with a colon.
  • fb=/dev/fbN - Specifies the framebuffer devices. On multiple display setups this typically allows running the application on different displays. For the time being there is no way to use multiple framebuffers from one Qt application.
  • size=<width>x<height> - Specifies the screen size in pixels. The plugin tries to query the display dimensions, both physical and logical, from the framebuffer device. This may not always lead to proper results however, and therefore it may become necessary to explicitly specify the values.
  • mmsize=<width>x<height> - Physical width and height in millimeters.
  • offset=<width>x<height> - Offset in pixels specifying the top-left corner of the screen. The default position is at (0, 0).
  • nographicsmodeswitch - Do not switch the virtual terminal to graphics mode (KD_GRAPHICS). In addition to switching to graphics mode, the blinking cursor and screen blanking are normally disabled too. When this parameter is set, these are also skipped.
  • tty=/dev/ttyN - Overrides the virtual console. Only used when nographicsmodeswitch is not set.

6.5 Target Error

6.5.1 非UTF-8

root@ubuntu:/userdata# ./HelloQt6
Detected locale "C" with character encoding "ANSI_X3.4-1968", which is not UTF-8.
Qt depends on a UTF-8 locale, and has switched to "C.UTF-8" instead.
If this causes problems, reconfigure your locale. See the locale(1) manual
for more information.
  • 解决方案
# 查看支持的编码格式
locale -a
# 解决此问题
export LC_ALL=en_US.UTF-8

参考链接

- [参考1](https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4)
- [参考2](https://mechatronicsblog.com/cross-compile-and-deploy-qt-5-12-for-raspberry-pi/)

Cross-Compile QT 5.15.9/QT6相关推荐

  1. QT 5.15 最新安装指南(针对不同系统)

    转载标明出处! Qt 5.15.2 安装指南 文章目录 Qt 5.15.2 安装指南 1. 如何选择Qt 2. 环境选择 3. 前期准备 4. 安装步骤 4.1 Qt 在线安装器 4.2 Window ...

  2. QR扫码综合示例教程(二十二)Qt5.15.2+Qt6.2.1(qml)+opencv4.5.4解决扫码聚焦、闪光灯(多线程、微信扫码)

    前言: 因笔者前期设备限制,并没有考虑摄像头聚焦.闪光灯相关,有小伙伴问到相关问题,所以笔者就测试了下.结果有点失望,但仍然共享给小伙伴们,以减少走弯路 本教程是在 Qt5.15.2+Qt6.2.1( ...

  3. How to cross compile the PPP to arm-xscale

    1. 如果需要让pppd支持packet filtering 功能的话就需要编译libpcap. cross compile libpcap-1.0.0 ./configure --host=arm- ...

  4. 【Qt】New Features in Qt 5.15

    00. 目录 文章目录 00. 目录 01. 概述 02. 新功能(within existing modules) Qt 3D Qt Core Qt GUI Qt 位置 Qt 多媒体 Qt 网络 Q ...

  5. Linux qt 更新,Qt 5.15 Beta 2 发布,Qt 6之前的最后一个重大更新

    即将发布的Qt 5.15工具包的第二个beta版现已可供测试. Qt 5.15是Qt 6.0之前的最后一个重大更新,而且有望在11月左右发布.图形方面的Qt 5.15一直致力于改进Qt 3D轮廓分析, ...

  6. qt及qt quick开发实战精解_Qt5实战001:Qt 5.15下载安装详解

    什么是QT Qt是一个款跨平台的C++图形用户界面应用程序开发框架,支持包括不限于Windows.Linux.Mac OS X.Android.iOS.WinCE.Unix等平台.Qt 可以绘制漂亮的 ...

  7. 【网络通信 -- 直播】OBS -- 基于 Visual Studio 2019 + Qt 5.15.2 编译调试 OBS studio 源码

    [网络通信 -- 直播]OBS -- 基于 Visual Studio 2019 + Qt 5.15.2 编译调试 OBS studio 源码 [1]OBS 代码获取 github : git clo ...

  8. windoes 平台 Qt 的下载与安装-(Qt 5.15.2 LTS,这是一个长期支持版本)

    Qt 是一个跨平台的 C++图形用户界面应用程序框架 (1)windoes 平台 Qt 的下载与安装: Qt 5.15之前的版本可以离线安装,直接下载离线安装包即可: 下载地址:https://dow ...

  9. Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 02 - BasicLighting

    学习learnopengl文章对应地址:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/ VS.qt版本分别给 ...

最新文章

  1. 三菱modbusRTU通讯实例_「笔记」信捷plc应用,两个plc通讯篇
  2. R语言ggplot2可视化:使用长表数据(窄表数据)( Long Data Format)可视化多个时间序列数据、在同一个可视化图像中可视化多个时间序列数据(Multiple Time Series)
  3. Java 批量文件不打包下载_【Java】Java批量文件打包下载zip
  4. 网页图表Highcharts实践教程之外层图表区
  5. 【鸿蒙 HarmonyOS】Ability 中使用 XML 布局文件 绘制布局及 UI 组件
  6. HTML学习笔记之三(localstorage的使用)
  7. 在mac上安装gitlab
  8. react(85)--error:Error creating bean with name ‘onlineStudyController‘:
  9. TKmybatis和mybatisplus哪个好用
  10. AAAI 2021 | 视频超分中的可变形对齐解读
  11. DCMTK3.6.0 (MT支持库)安装 完整说明
  12. 暗月渗透实战靶场-项目八(上)
  13. 计算机多媒体课件制作,多媒体课件制作软件
  14. usb 键盘码表_电脑键盘对应的二进制码表
  15. uniapp 安卓ios端热更新
  16. 企业微信H5_自建应用连接H5
  17. 免费代理IP地址列表
  18. Android——自定义带刻度的SeekBar单向拖动条
  19. 不相交轮换的乘积怎么求_怎么样将一个轮换分解成不相交的轮换的乘积
  20. linux系统命令cd怎么使用,linux命令怎么用_Linux cd命令该怎么使用

热门文章

  1. 开发板通过tftp服务 下载Ubuntu上的文件
  2. 合勤xgs1910交换机console口配置
  3. MySQL 数据表的关联关系 --- 一对一关联
  4. antd DatePicker 时间控件 限制选择当天之前时间,今天之前时间
  5. 网络学习系列-VLANIF
  6. vcenter 6.0进入linux界面
  7. 7.31 计算器基本完工
  8. 网络工程师日常-工具篇
  9. Kubernetes插件:Intel sriov-cni插件简介/修改
  10. Strapi-API服务器 超详细配置使用攻略