安装docker是为了方便运行后面的程序
1、刚开始有一堆奇怪版本的包,用apt update + apt upgrade 或者 apt dist-upgrade甚至apt autoremove都升级不掉
apt install -y aptitude
aptitude purge "~o"
aptitude purge "~c"
apt update
apt upgrade
apt dist-upgrade
apt autoremove
安装附加包
apt install -y vim iputils-ping


https:
下找到Kernel compatibility段落,可以直接使用下面命令下载
运行下面两段
curl https:
bash ./check-config.sh
注意,下载有概率下载失败,可以配置代理,也可以直接下载完了再上传到源码目录
也不是每个页面都要绿了
docker本身比较好搞,但是在内核编译阶段大概要打开将近20个选项。每个选项都有自己的依赖,所以比较费劲。好在官方给提供了脚本,以供参考

编译完成后,单独上传内核即可。直接使用瑞芯微烧写工具即可完成内核的单独更新。
注意,如果单独烧写内核直接写写不进去,会提示空间不足,直接强行烧写就行。或者如果平时编译过其他组件可以整体烧录。但是整体烧录有个缺点,那就是会造成之前上传的工作丢失。
注意,烧录镜像不会对外接存储造成影响。
二、应用开发
cmake_minimum_required(VERSION 3.20)
SET(CMAKE_C_COMPILER "/workspace/gcc_aarch64_1221_236/bin/aarch64-linux-gnu-gcc")
SET(CMAKE_CXX_COMPILER "/workspace/gcc_aarch64_1221_236/bin/aarch64-linux-gnu-g++")
project(EnergyTraderG6Demo)
SET(VERSION_INFO 1.0.0)
set(CMAKE_CXX_STANDARD 20)
SET(CMAKE_C_STANDARD 17)
set(CMAKE_SYSROOT "/data/sysroot_236_aarch64")
add_executable(EnergyTraderG6Demo main.cpp
)
target_link_libraries(${PROJECT_NAME} nanoid)
#include <iostream>
#include <nanoid/nanoid.h>
#include <string>
int main() {
std::cout << "程序启动" <<std::endl;
std::string id = nanoid::generate();
std::cout << id << std::endl;
return 0;
}
这里指定了目标程序的搜索地址。如果想要彻底脱离原生的gcc运行环境,-Wl,--dynamic-linker
是为了改变程序加载器的位置。
注意,ld-linmux-aarch64.so.1在不同操作系统和编译器版本上都可能产生名字的差异,主要是这个结构就行。同时,这其实不是一个库文件,这本质是一个可执行文件。因此必须确保本文件是拥有可执行权限的。
这个库前面的路径是额外的库搜索路径,不会覆盖系统默认,但是优先级会低于系统默认路径。优先级最高的是LD_LIBRARY_PATH(注意还有个LIBRARY_PATH。带LD的是指定运行目录,不带的是指定编译搜索路径。)。其优先级最高,高于rpath,高于系统默认。
为了编译速度,可以使用python -m pip install ninja
安装ninja作为编译工具。
cmake -G Ninja ..
ninja
即可编译出可执行文件。
这里插一个如何构建sysroot的小妙招。当然,操作系统规模不能太小。但是太小的操作系统因为性能有限也不建议用哪些复杂编译的库。
直接在目标板子上构建docker,然后找一个gcc版本合适的镜像(我这里选择的python:3.13.2-slim-bookworm。glibc版本为2.36,gcc版本为1.12.0。注意,1.12.1和1.12.0版本的gcc的glibc的版本是2.36和2.37混合的,这里需要确认一下。)
然后,交叉编译器的官网有sysroot文件和glibc文件。将libc的目录提到根目录中,然后将两个压缩包文件进行合并。将根目录里的lib和lib64复制进/usr/lib和/usr/lib64,将include统一复制到/usr/include里,不要改变其目录结构,不用复制多份。然后提取出这两个文件夹的所有内容到一个独立的文件夹里。然后用ln -s lib usr/lib
以及 ln -s lib64 usr/lib64
。此时创建完成了一个基本的sysroot。注意,有没有lib64不取决于是否使用64位库,仅仅取决于你的编译器。而你的系统是否会搜索Lib64目录仅仅取决于你运行软件的文件系统配置。
我的建议是sysroot不需要lib64目录,对于arm处理器来说不会有跨平台运行的机会。
然后直接在容器里用apt安装想要的库。
然后把/usr/lib和/usr/include整个目录直接复制出来。(如果有lib64目录,请大胆地融合进去。除非你是x86上有多架构兼容的需求,这种情况千万不能合并,会死人。)
然后下面记住顺序,反过来我没试过。
要首先将安装完库的/usr/lib拿出来。然后将刚才用sysroot和glibc创建出来的sysroot直接覆盖上来。此时,sysroot就创建完成了。
注意,上面是编译路径,运行路径就更简单了,直接把include删了就行。如果还想缩减,把.a和.la都删了。毕竟运行环境要静态库没用,又不需要现场引用。