文章目录
- 编译原生SDK
- LinuxSDK的安装
- 第一步解压LinuxSDK
- 第二步安装依赖软件
- 第三步解压Buildroot的dl文件
- Linux系统镜像编译、生成
- 第一步 配置编译环境
- 第二步 编译 LinuxSDK
- 编译上面配置好的 环境配置
- 编译 LinuxSDK
- 配置内核选项
- 配置 Buildroot
- 编译 Qt 库
- 编译生成 Linux 系统镜像
- 局部编译
- SPL 和 U-Boot 编译
- 内核编译
- 设备树镜像编译
- 文件系统编译
- 最后生成镜像
- 配置交叉编译链
- 第一步 找到交叉编译链的路径
- 第二步 添加交叉编译链路径到环境变量中
- 第三步 测试
编译原生SDK
LinuxSDK的安装
第一步解压LinuxSDK
找到创龙官方给的TLT113的SDK包,目录在:\TLT113-EVM(Buildroot-2019.02)_V1.8\4-软件资料\Linux\LinuxSDK下面的LinuxSDK-v2.5.tar 直接拷贝到Samba共享文件里面,Samba共享文件的建立参考博文,点击直接跳转:(一)开发环境搭建以及配置
拷贝如图:
执行解压命令:
tar -zxvf example.tar.gz -C /path/to/destination // 格式
tar -zxvf LinuxSDK-v2.5.tar.gz -C /home/zhua/SDK // 实际书写 -C C是大写的
进入解压的LinuxSDK可以看到如下:
内容说明:
第二步安装依赖软件
为什么要安装依赖软件:
即使 Linux SDK
包含了 U-Boot
、Linux Kernel
和 Buildroot
的源码,构建这些组件仍然需要一些宿主机上的工具和库,即所谓的“依赖软件工具”。这是因为:
-
编译工具链:
- 构建 Linux 内核、用户空间应用程序和其他组件需要一个交叉编译工具链。虽然有些 SDK 可能自带工具链,但其他情况下你可能需要安装如
gcc
、g++
等编译器以及相关的开发库。
- 构建 Linux 内核、用户空间应用程序和其他组件需要一个交叉编译工具链。虽然有些 SDK 可能自带工具链,但其他情况下你可能需要安装如
-
构建工具:
- 构建过程通常依赖于一系列的工具,例如
make
、cmake
、autotools
等,用于解析 Makefile 或 CMakeLists.txt 文件并执行编译命令。此外,patch
、diff
、sed
、grep
等工具也可能在应用补丁或进行文本处理时用到。
- 构建过程通常依赖于一系列的工具,例如
-
版本控制系统:
- 如果你需要从源代码仓库(如 Git)拉取最新的源代码或补丁,那么相应的版本控制工具也是必需的。
-
辅助工具:
- 某些特定的构建任务可能还需要额外的工具,比如
flex
、bison
用于生成解析器,dtc
(Device Tree Compiler)用于处理设备树源文件等。
- 某些特定的构建任务可能还需要额外的工具,比如
-
依赖库:
- 构建过程中可能会用到一些宿主机上的库,例如 OpenSSL 库用于加密功能,或者 Python 库用于运行某些脚本。这些库通常不会包含在嵌入式系统的镜像中,但在构建期间是必要的。
-
调试工具:
- 开发和调试过程中可能需要用到
gdb
、strace
等调试工具,这些工具同样需要预先安装在宿主机上。
- 开发和调试过程中可能需要用到
-
文件系统工具:
- 创建根文件系统镜像时,可能需要使用特定的工具来创建或修改文件系统格式,例如
mkfs.ext4
用于创建 ext4 文件系统。
- 创建根文件系统镜像时,可能需要使用特定的工具来创建或修改文件系统格式,例如
-
压缩和打包工具:
- 构建完成后,你可能需要用
tar
、gzip
、xz
等工具来打包生成的文件,或者使用genimage
工具根据配置文件生成启动所需的镜像文件。
- 构建完成后,你可能需要用
为了简化这个过程,许多 Linux SDK
提供了文档或脚本来指导用户安装这些依赖项。有时,SDK 会提供一个 setup.sh
或类似的脚本,它可以帮助自动检测并安装缺失的依赖项。如果你正在使用的 SDK 没有提供这样的帮助工具,你可以参考官方文档中的依赖列表,并按照说明安装必要的软件包。
总结,通俗来说说:只有源码没有工具怎么编译呢?所以必须安装各种编译时,所需要的依赖软件。
同样在官方资料里面也有如何安装工具包的脚本。
目录在:“\TLT113-EVM(Buildroot-2019.02)_V1.8\4-软件资料\Linux\Tools\”
在将目录下的工具包脚本文件 install_tools.sh 拷贝至 SDK工作目录下,执行脚本文件安装 LinuxSDK 开发包依赖软件。
同样也是借助Samba共享文件传入
然后拷贝到刚才创建的SDK目录下面,再执行脚本进行安装依赖软件
./install_tools.sh
中间会弹出对话框,选择NO即可。
安装完成如图:
第三步解压Buildroot的dl文件
为什么要解压Buildroot的dl文件:
关于 Buildroot dl
文件夹:
当你使用 Buildroot
构建一个项目时,它会下载所需的源代码包(如工具链、内核、BusyBox 等)到一个叫做 dl
的目录中。这个 dl
目录通常位于 Buildroot
项目的根目录下。该目录用于存放所有从互联网上下载的软件包的原始压缩文件(例如 .tar.gz
, .tar.bz2
等格式)。这样做有以下几个好处:
- 避免重复下载:如果你需要重新构建或者在同一网络下的其他机器上进行构建,可以直接使用已经下载好的文件,而不需要再次从网上下载。
- 离线构建:一旦所有的依赖都下载完毕并存放在
dl
文件夹中,即使在没有网络连接的情况下也可以完成构建。
因此,Buildroot dl
文件夹是 Buildroot
用来缓存所下载的源代码包的地方,以方便后续的构建过程。如果你解压了一个 Buildroot
的归档文件,并且其中包含 dl
文件夹,那么意味着之前有人已经下载过这些文件,你可以利用它们来进行更快的构建。
说人话,就是提前将下载好的源代码包放在这个dl文件里面。
即便 SDK 包含了 U-Boot、Kernel 和 Buildroot 的源码,
但构建完整的根文件系统可能还需要其他库和工具。
这些额外的依赖项通常不在 SDK 中提供,仍然需要通过 Buildroot 下载并存储在 dl 文件夹中。有时资料包里面会提前下载好,节省编译时间。
dl文件目录在:“\TLT113-EVM(Buildroot-2019.02)_V1.8\4-软件资料\Linux\LinuxSDK\”目录下
再将目录下的 dl.tar.gz 压缩包拷贝至 SDK目录里面,同样是借助Samba共享文件
这里:dl.tar.gz 为 Buildroot dl 目录压缩包,用于存放从官网下载的开源软件包,LinuxSDK 编译时可从该目录获取开源包,以节约下载时间,提高编译效率,且能避免因网络环境差异导致编译 Buildroot 失败的问题。
拷贝如图:
解压到 /SDK/T113-i_v1.0/buildroot/buildroot-201902/ 下面去 这下面本来就有一个dl文件,此时正好覆盖了,dl此时里面已经下载好了很多依赖包
指令:
tar xvf dl.tar.gz -C ../SDK/T113-i_v1.0/buildroot/buildroot-201902/
Linux系统镜像编译、生成
第一步 配置编译环境
首先:进入 T113-i_v1.0 目录执行如下命令,清除所有编译和配置生成文件。
指令:
./build.sh distclean
执行如下命令,配置 Linux 内核、内核版本、处理器型号、评估板型号(tlt113-evm-emmc
)、显示方式、编译器等信息,当然可以配置nand版本,我个人适应emmc固化启动的。
./build.sh config
配置如下:
说明:
选择 gnueabi 将配置为软浮点编译器
选择 gnueabihf 将配置为硬浮点编译器
最后配置完成:
到这里只是配置好编译环境了,下面再进行编译。
第二步 编译 LinuxSDK
编译上面配置好的 环境配置
source ./build/envsetup.sh
编译 LinuxSDK
LinuxSDK 源码包默认提供的是 Linux 内核源码,若对系统实时性要求较高,请先替换 Linux-RT 内核源码至 LinuxSDK,再进行编译。替换完成后,需要执行"./build.sh config"命令重新配置编译环境,否则会导致编译失败。
这里我们不需要,直接在 T113-i_v1.0 目录下执行如下命令,一键编译 SPL、U-Boot、Linux 内核和 buildroot文件系统
指令:
./build.sh
备注:
(1) 首次执行"./build.sh"命令编译 LinuxSDK,需再执行一次"./build.sh"命令,否则会
出现打包生成的 Linux 系统镜像在评估板无法正常启动的现象。
(2) 执行"./build.sh distclean"清除命令后,需执行两次"./build.sh"命令,否则会出现打
包生成的 Linux 系统镜像在评估板无法正常启动的现象。
也就是需要执行俩次./build.sh
等待时间不一致,这个根据电脑配置的不同,时间也不同。我编译了大概80分钟
最终编译完成如图:
生成 SPL、U-Boot、Linux 内核和 buildroot 文件系统镜像文件,镜像文件需转化为.fex 格式后使用。
这些文件分别在:
(1) 生成 SPL 镜像文件为"out/t113_i/tlt113-evm-emmc/longan/"目录下的 boot0_nand_s
un8iw20p1.bin、boot0_sdcard_sun8iw20p1.bin 和 boot0_spinor_sun8iw20p1.bin。
(2) 生成 U-Boot 镜像文件为"out/t113_i/tlt113-evm-emmc/longan/u-boot-sun8iw20p1.bi
n"。
(3)生成 Linux 内核镜像文件为"out/t113_i/tlt113-evm-emmc/longan/boot.img"。
(4)生成文件系统镜像文件"out/t113_i/tlt113-evm-emmc/longan/rootfs.ext4",rootfs.
ext4 为 EXT4 格式,适用于 Micro SD 卡和 eMMC。如果用的是nand版本,对应的文件系统镜像为:rootfs.ubifs 为 UBIFS格式,适用于 NAND FLASH;
配置内核选项
(如果需要的情况下,一般默认,不需要管)
执行 ./build.sh 命令编译内核后,编译生成的相关文件会存放在"out/kernel/build/"目录下,含.config 内核配置文件,此时才能配置内核选项。在前面编译LinuxSDK的时候提供了直接替换的编译方式。
这里可以通过执行 make ARCH=arm menuconfig命令打开图形配置界面。此命令通过读取当前目录的.config 文件,以图形界面的方式提供内核编译配置查看和修改方法。修改完成,内容就会更新到.config文件中,再进行SDK的编译就可以了。
ARCH 是一个环境变量,用来指定目标架构(Architecture)
arm 表示你正在为目标是 ARM 架构的处理器编译代码
除了 arm,ARCH 变量还可以取其他值,具体取决于你想要编译的目标架构。例如:
1.x86 或 i386:用于传统的 32 位 Intel/AMD 处理器。
2.x86_64 或 amd64:用于 64 位 Intel/AMD 处理器。
3.mips:用于 MIPS 架构的处理器。
4.powerpc 或 ppc:用于 PowerPC 架构的处理器。
5.riscv:用于 RISC-V 架构的处理器。
总之,ARCH=arm 是告诉构建系统你希望为 ARM 架构编译代码,而 menuconfig 则提供了友好的界面来配置编译选项。
menuconfig:是一个交互式的配置工具,允许用户通过基于文本的菜单界面来选择 和 配置内核或项目的各种选项。它会打开一个图形化的终端界面,让你能够轻松地浏览和修改配置选项。但是需要 ncurses 库支持。ncurses 库提供了一系列的 API 函数供调用者生成基于文本的图形界面,因此需要先执行如下命令通过网络安装 ncurses 库。
安装ncurses库指令:
sudo apt-get install libncurses5-devsudo apt-get install libncursesw5-dev
ncurses 库安装完成后,进入含有内核配置文件的目录“out/kernal/build”,执行指令:
make ARCH=arm menuconfig
进入图形界面进行内核编译配置查看和修改。
用键盘上下键移动,用回车表示确认。
这里左上角能明显看到是.config文件。
修改完Save 回车即可。
会提醒你修改的内容加载到.config文件中。
最后Exit即可。
配置完,一定要重新编译LinuxSDK。
配置完,一定要重新编译LinuxSDK。
配置完,一定要重新编译LinuxSDK。
配置 Buildroot
(如果需要的情况下,一般默认,不需要管)
如需修改 Buildroot 配置,和配置内核选项一样的操作。通过读取out/t113_i/tlt113-evm-emmc/longan/buildroot目录下的.config 文件,以图形界面的方式提供文件系统编译配置查看和修改。
先进入到buildroot目录里面。
再执行指令:
make menuconfig
以下操作同 配置内核选项 一样的操作
配置完,一定要重新编译LinuxSDK。
配置完,一定要重新编译LinuxSDK。
配置完,一定要重新编译LinuxSDK。
编译 Qt 库
若需编译生成支持 Qt 功能的 Linux 系统镜像(看需求我这里不许要就没有编译Qt库)
一定要回到./build.sh脚本所在目录执行指令哈。
指令:
./build.sh qt
编译完成:
然后一定要重新编译LinuxSDK。
然后一定要重新编译LinuxSDK。
然后一定要重新编译LinuxSDK。
编译生成 Linux 系统镜像
也是在./build.sh所在目录下操作的哈。
指令:
./build.sh pack
本次操作会:
将 SPL 镜像(boot0_nand_sun8iw20p1.bin、boot0_sdcard_sun8iw20p1.bin 和boot0_spinor_sun8iw20p1.bin)转化为boot0_sdcard.fex、boot0_nand.fex、boot0_spinor.fex 文件;
将 U-Boot 镜像(u-boot-sun8iw20p1.bin)、设备树镜像、sys_config 配置文件合并生
成 boot_package.fex 文件;
将 Linux 内核镜像(boot.img)转化为 boot.fex 文件;
将文件系统镜像文件 rootfs.ext4 转化为 rootfs.fex 文件;
最后将 boot0_sdcard.fex、boot0_nand.fex、boot0_spinor.fex、boot_package.fex、boot.fex、rootfs.fex 等文件,合并生成out/内的 t113_i_linux_tlt113-evm-emmc_uart0.img Linux 系统镜像文件。
如图:
boot0_sdcard.fex、boot0_nand.fex、boot0_spinor.fex、boot_package.fex、boot.fex、rootfs.fex 文件所在路径以及哪些文件转化而来的:
局部编译
SPL 和 U-Boot 编译
在 T113-i_v1.0 目录下执行如下命令,编译 SPL 和 U-Boot。
指令:
./build.sh brandy
同样编译完成后,生成 SPL 镜像文件为"out/t113_i/tlt113-evm-emmc/longan/“目录下的 bo
ot0_nand_sun8iw20p1.bin、boot0_sdcard_sun8iw20p1.bin 和 boot0_spinor_sun8iw20p1.bi
n。生成 U-Boot 镜像文件为"out/t113_i/tlt113-evm-emmc/longan/u-boot-sun8iw20p1.bin”。
最后直接./build.sh pack直接并包即可
内核编译
在 T113-i_v1.0 目录下执行如下命令,编译 Linux 内核。
./build.sh kernel
最后直接./build.sh pack直接并包即可
设备树镜像编译
我所用的板子支持分别支持 HDMI OUT、TFT LCD、MIPI LCD、LVDS LCD、CVBS 显示的设备树
文件;
如下表所示。其中“device/config/chips/t113_i/configs/tlt113-evm-emmc/linux-5.4/”目
录下存放 Linux 设备树源文件;
“device/config/chips/t113_i/configs/tlt113-evm-emmc/”目录下存放 U-Boot 设备树源文件(uboot-board-xxx.dts);
Linux 系统默认使用支持 HDMI OUT 显示的设备树文件。如需替换为其他显示方式,请进入 T113-i_v1.0 目录,执行如下命令,选择对应显示方式,并配置 Linux 内核、内核版本、处理器型号、评估板型号(tlt113-evm-emmc)、编译器等信息。
其实就是前面的 配置编译环境
./build.sh config
这里就不赘述了
注意这里需要编译LinuxSDK,才能将设备树编入其中。因为没有编译可以将设备树编入,所以直接总的一步操作
注意这里需要编译LinuxSDK,才能将设备树编入其中,不能简单并包
注意这里需要编译LinuxSDK,才能将设备树编入其中,不能简单并包
注意这里需要编译LinuxSDK,才能将设备树编入其中,不能简单并包
文件系统编译
在 T113-i_v1.0 目录下执行如下命令,编译文件系统。
./build.sh buildroot
最后生成镜像
说白了就是把前面LinuxSDK编译拆分了 ,其它步骤不变,最后还需要并包。注意设备树需要直接编译LinuxSDK,其他的局部编译直接并包即可
执行如下命令,将镜像文件转化为.fex 格式,并重新生成系统镜像。
./build.sh pack
注意所有的局部编译,除了设备树,其他均可直接./build.sh pack直接并包,设备树则需要编译LinuxSDK
注意所有的局部编译,除了设备树,其他均可直接./build.sh pack直接并包,设备树则需要编译LinuxSDK
注意所有的局部编译,除了设备树,其他均可直接./build.sh pack直接并包,设备树则需要编译LinuxSDK
配置交叉编译链
由于嵌入式设备不支持直接再本机上编译,因此要在宿主机上面进行编译,所以必须配置交叉编译链。
上面已经编译好了LinuxSDK,编译生成了交叉编译链,下面进行配置:
第一步 找到交叉编译链的路径
在 /home/zhua/SDK/T113-i_v1.0/out/t113_i/tlt113-evm-emmc/longan/buildroot/host/usr/bin 下
此时只能在这个目录下使用交叉编译链在其他目录下不可使用因此必须把交叉编译链路径配置到环境变量中
第二步 添加交叉编译链路径到环境变量中
添加交叉编译链路径到环境变量中是为了交叉编译链永久有效,并且在任意家目录下都可以直接使用
查看当前环境变量:
echo $PATH
下面把交叉编译链的路径加入到环境变量中:
sudo vi ~/.bashrc
添加如下指令:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-gcc
export PATH=$PATH:/home/zhua/SDK/T113-i_v1.0/out/t113_i/tlt113-evm-emmc/longan/buildroot/host/usr/bin
说明:
export ARCH=arm / /编译ARM架构的属性
export CROSS_COMPILE=arm-linux-gnueabi-gcc // 就是对应的交叉编译工具名字
export PATH=$PATH:/home/zhua/SDK/T113-i_v1.0/out/t113_i/tlt113-evm-emmc/longan/buildroot/host/usr/bin // 交叉编译工具所在路径
其实你不写前俩条也是ok的(亲测)
按ese 再按:wq 退出保存。
然后执行指令:这条命令是加载这些设置的环境变量
source ~/.bashrc
此时再用指令:echo $PATH查看到环境变量为:
注意注意 此时要新开一个命令终端,全局的环境变量才生效
注意注意 此时要新开一个命令终端,全局的环境变量才生效
注意注意 此时要新开一个命令终端,全局的环境变量才生效
第三步 测试
在任何家目录下面,提前写好了一的demo.c,然后直接用arm-linux-gnueabi-gcc 交叉编译工具编译demo.c
指令:
arm-linux-gnueabi-gcc demo.c
同时用gcc 编译 demo.c
指令:
gcc demo.c -o b.out
可以看到编译出来的a.out可执行文件是ARM架构的。b.out可执行文件是x86架构的。
再执行,可以看到只有x86架构才能在Ubuntu系统上运行,ARM架构需要在ARM平台运行。