2. 构建环境搭建:Ubuntu开发环境配置、依赖包安装、交叉编译工具链配置
说实话,很多做嵌入式Linux的朋友,一开始就栽在环境搭建上。不是缺这个包,就是工具链版本不对,折腾半天连个helloworld都编译不过去。我刚开始接触全志Tina的时候,也踩过不少坑。今天咱们就把这第一步走稳了。
环境搭建说白了就三件事:装系统、装依赖、配工具链。顺序不能乱,版本不能错。咱们一个一个来。
2.1 Ubuntu开发环境配置
我个人习惯用 Ubuntu 18.04 LTS 或 20.04 LTS。为什么?因为全志官方SDK在这两个版本上验证得最充分。你非要用22.04甚至更新的版本,也不是不行,但有些依赖包的版本会变,你得自己踩坑。
注意: 不建议使用Ubuntu 16.04及以下版本,GCC版本太老,编译Tina内核时会报一堆语法错误。也不建议用Windows WSL1,文件系统性能太差,编译一次要等半天。
安装Ubuntu时,我建议你给虚拟机或双系统至少分配:
- CPU核心数: 4核以上(编译是并行任务,核心越多越快)
- 内存: 8GB以上(我遇到过内存不够,编译到一半直接OOM killed)
- 磁盘空间: 至少100GB(Tina SDK解压后大概20GB,编译产物再占30GB,加上缓存,100GB是底线)
- 交换分区: 建议8GB(防止内存溢出)
| 配置项 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | 2核 | 4核+ | 编译时-j参数决定并行度 |
| 内存 | 4GB | 8GB+ | 内存不足会导致编译中断 |
| 磁盘 | 60GB | 120GB+ | SDK+编译产物+缓存 |
| 交换分区 | 4GB | 8GB | 防止OOM |
2.2 依赖包安装
系统装好了,接下来就是装依赖。这一步看似简单,但最容易出问题。我记得有一次帮同事排查编译错误,折腾了两小时,最后发现是少装了一个libncurses5-dev。
全志官方文档里列了一长串依赖包,我帮你整理成了一条命令,直接复制粘贴就行:
sudo apt-get update
sudo apt-get install -y \
build-essential \
git \
subversion \
wget \
curl \
python3 \
python3-pip \
python3-dev \
libncurses5-dev \
libncursesw5-dev \
zlib1g-dev \
libssl-dev \
liblz4-tool \
u-boot-tools \
device-tree-compiler \
swig \
bc \
bison \
flex \
rsync \
cpio \
unzip \
p7zip-full \
dos2unix \
texinfo \
file \
gettext \
pkg-config \
libtool \
automake \
autoconf \
cmake \
ninja-build \
ccache
小技巧: 我习惯把这条命令保存成一个shell脚本,比如
setup_tina_env.sh。以后换机器或者重装系统,直接跑一遍就行,不用再一个个查。
这里面有几个包我要特别说一下:
- ccache: 编译缓存工具。第一次编译慢,第二次就快很多。我建议你安装后设置
export CCACHE_DIR=/path/to/ccache,把缓存放到一个单独的磁盘分区,避免占满系统盘。 - libncurses5-dev: 这个包是menuconfig的依赖。没有它,你执行
make menuconfig时会报错。 - device-tree-compiler: 设备树编译器。全志的板子依赖设备树来配置硬件,这个包必须装。
2.3 交叉编译工具链配置
交叉编译工具链,说白了就是一套能在x86电脑上生成ARM架构可执行文件的工具。全志Tina SDK自带工具链,但你需要知道它在哪、怎么用。
工具链的位置一般在SDK目录下的:
tina-sdk/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/
嗯,这里要注意。全志的工具链是基于musl libc的,不是glibc。musl更轻量,但有些glibc特有的函数它不支持。我在移植一个开源库时就遇到过strerror_r的兼容性问题。
配置工具链环境变量,我建议你这样做:
# 打开你的shell配置文件
vim ~/.bashrc
# 在文件末尾添加以下内容
export TINA_SDK_PATH=/home/yourname/tina-sdk
export PATH=$TINA_SDK_PATH/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin:$PATH
export CROSS_COMPILE=arm-openwrt-linux-muslgnueabi-
export ARCH=arm
# 使配置生效
source ~/.bashrc
验证工具链是否配置成功:
arm-openwrt-linux-muslgnueabi-gcc --version
如果能看到版本信息,说明工具链配置成功了。
核心概念:
CROSS_COMPILE环境变量定义了交叉编译器的前缀。比如你执行make时,Makefile会自动调用$(CROSS_COMPILE)gcc,也就是arm-openwrt-linux-muslgnueabi-gcc。这个前缀不能写错,否则编译会报"command not found"。
2.4 环境验证:编译一个测试程序
环境配好了,咱们写个简单的C程序测试一下:
// hello_tina.c
#include <stdio.h>
int main() {
printf("Hello, Tina Linux!\n");
return 0;
}
编译命令:
arm-openwrt-linux-muslgnueabi-gcc -o hello_tina hello_tina.c
查看生成的文件类型:
file hello_tina
如果输出类似:
hello_tina: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-armhf.so.1, not stripped
说明你的交叉编译环境完全OK了。
避坑指南: 我曾经遇到过一个问题——编译出来的程序在板子上运行报"Segmentation fault"。查了半天,发现是工具链版本和内核版本不匹配。全志Tina SDK里自带的工具链是经过验证的,不要自己从网上下载其他版本的工具链替换,除非你很清楚自己在做什么。
2.5 知识体系总览
下面这张图帮你理清本章的核心逻辑:
2.6 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
arm-openwrt-linux-muslgnueabi-gcc: command not found |
工具链路径未加入PATH | 检查~/.bashrc中的PATH配置,执行source ~/.bashrc |
make menuconfig报错 |
缺少libncurses5-dev | 安装libncurses5-dev和libncursesw5-dev |
| 编译过程中断,提示"Killed" | 内存不足,OOM killer杀掉了进程 | 增加交换分区或物理内存,减少-j并行数 |
| 编译出的程序在板子上运行报错 | 工具链版本与内核不匹配 | 使用SDK自带的工具链,不要自行替换 |
我的经验: 每次搭建新环境,我都会先跑一遍
hello_tina测试程序。这一步能帮你快速定位问题,而不是等到编译整个SDK时才发现工具链没配好。磨刀不误砍柴工,环境搭建这一步值得你花时间做扎实。