2. 全志Tina Linux概述

说实话,很多做嵌入式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 知识体系总览

下面这张图帮你理清本章的核心逻辑:

构建环境搭建知识体系 Ubuntu开发环境 依赖包安装 交叉编译工具链 Ubuntu 18.04/20.04 LTS 硬件资源分配 核心依赖包 ccache加速 musl工具链路径 环境变量配置 CROSS_COMPILE前缀 测试程序验证 核心原则 版本匹配 > 路径正确 > 环境变量生效 先验证再编译,避免浪费大量时间在环境问题上

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时才发现工具链没配好。磨刀不误砍柴工,环境搭建这一步值得你花时间做扎实。