1. 环境准备与依赖安装
最近在折腾全志Tina SDK的编译环境搭建,发现Ubuntu 22.04是个挺不错的选择。不过官方文档大多基于Ubuntu 16.04或18.04,在新系统上直接编译会遇到不少问题。我自己踩过不少坑,这里把完整的环境配置过程分享给大家,让你少走弯路。
首先需要安装必要的编译工具和依赖库。全志Tina SDK编译需要一堆开发工具和32位库支持,这个安装命令我测试过很多次,在Ubuntu 22.04上很稳定:
sudo apt-get update
sudo apt-get install build-essential subversion git-core \\
libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev \\
xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip \\
lib32z1 lib32z1-dev lib32stdc++6 libstdc++6 -y libc6:i386 \\
libstdc++6:i386 lib32ncurses5 lib32z1
这里有个小细节要注意:Ubuntu 22.04默认没有启用32位库支持,需要先启用多架构支持:
sudo dpkg –add-architecture i386
sudo apt-get update
安装过程中如果遇到依赖冲突,可以尝试用aptitude来代替apt-get,它能更好地处理复杂的依赖关系。我遇到过几次依赖问题,都是用这个命令解决的:
sudo aptitude install [包名]
2. SDK获取与初始配置
环境准备好后,接下来要获取SDK源码。全志的SDK通常通过repo工具管理,需要先设置git用户信息:
git config –global user.email "your.email@example.com"
git config –global user.name "Your Name"
然后初始化repo并同步代码:
mkdir tina-sdk
cd tina-sdk
repo init -u https://github.com/allwinner-tina/tina-manifest.git
repo sync -j8
同步代码是个漫长的过程,取决于你的网络速度。我建议在晚上睡觉前开始同步,第二天早上就能用了。如果中途断线,可以重复执行repo sync命令继续同步。
同步完成后,先检查一下SDK的目录结构。典型的Tina SDK包含这些重要目录:
- brandy/ – 包含bootloader代码
- kernel/ – Linux内核源码
- target/ – 目标设备配置
- package/ – 应用程序包
- tools/ – 编译工具链
3. 环境变量设置与编译配置
环境变量设置是关键步骤,很多编译问题都出在这里。Tina SDK提供了环境设置脚本:
source build/envsetup.sh
执行这个脚本后,会添加很多有用的命令到你的环境里,比如croot(快速回到SDK根目录)、cout(跳到输出目录)等。我最喜欢的是cgrep,可以在整个SDK里快速搜索代码。
接下来选择编译配置:
lunch
你会看到一个菜单列表,选择对应的开发板配置。比如T113芯片通常选择t113_evb1-tina。这个步骤实际上设置了大量的环境变量,指定了交叉编译工具链、目标架构等关键参数。
设置完成后,建议检查一下交叉编译工具链是否正常:
echo $CC
which $CC
应该能看到类似arm-openwrt-linux-gcc这样的工具链路径。如果显示找不到,说明环境设置有问题,需要重新执行前面的步骤。
4. 常见编译问题与解决方案
在实际编译过程中,我遇到了不少问题,这里分享几个典型的案例和解决方法。
问题一:权限错误
configure: error: you should not run configure as root
这是很常见的错误,解决方法很简单但很重要:
sudo chown -R $USER:$USER .
export FORCE_UNSAFE_CONFIGURE=1
问题二:多重定义错误
multiple definition of `yylloc'
这个问题在Ubuntu 22.04上经常出现,需要修改dtc编译器的源码:
find . -name "dtc-lexer.lex.c" -exec sed -i 's/YYLTYPE yylloc;/extern YYLTYPE yylloc;/' {} \\;
问题三:_STAT_VER未定义
libfakeroot.c:99:40: error: '_STAT_VER' undeclared
这个问题需要修改libfakeroot的源码,在报错文件的开头添加:
#ifndef _STAT_VER
#if defined (__aarch64__)
#define _STAT_VER 0
#elif defined (__x86_64__)
#define _STAT_VER 1
#else
#define _STAT_VER 3
#endif
#endif
问题四:工具链兼容性问题
Ubuntu 22.04自带的GCC版本较新,可能会遇到各种奇怪的编译错误。如果遇到这类问题,可以尝试使用较旧的GCC版本:
sudo apt install gcc-9 g++-9
sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-9 100
sudo update-alternatives –install /usr/bin/g++ g++ /usr/bin/g++-9 100
5. 完整编译与打包
解决了各种编译问题后,就可以开始正式编译了。我建议第一次编译时使用单线程,这样更容易定位问题:
make -j1 V=s
V=s参数会显示详细的编译信息,虽然输出很多,但对于调试非常有用。编译成功后,下次就可以使用多线程加速编译了:
make -j$(nproc)
这里的$(nproc)会自动检测你的CPU核心数,比如8核CPU就用-j8。但要注意,有时候多线程编译会因依赖问题失败,这时候就需要回退到单线程。
编译完成后,需要打包生成固件镜像:
pack
这个命令会生成一个.img格式的固件文件,通常位于out/目录下,比如out/t113_evb1/tina_t113_evb1_uart0.img。这个文件就可以用全志的烧录工具写入开发板了。
6. 高级技巧与优化
经过几次完整编译后,我总结出一些提高效率的技巧。
增量编译:如果只修改了某个包,不需要重新编译整个系统。比如只修改了内核:
mkernel
或者只编译某个应用程序包:
cd package/utils/rwcheck
mm -B
清理技巧:有时候需要重新编译,但又不确定哪些文件被修改过,可以使用:
make clean
但要注意,这会清理所有编译产物,下次编译需要从头开始。如果只是想重新编译某个组件,更好的方法是只清理该组件:
make target/linux/clean
缓存利用:ccache可以显著加速重复编译,建议安装并启用:
sudo apt install ccache
export USE_CCACHE=1
export CCACHE_DIR=/path/to/ccache
ccache -M 50G
设置50G的缓存空间,对于大型项目编译速度提升很明显。
7. 烧录与调试
编译打包完成后,下一步就是烧录到设备上测试。全志提供了多种烧录方式,我最常用的是PhoenixSuit。
首先安装驱动和烧录工具,然后在设备上进入FEL模式(通常是通过按住FEL按钮再上电),连接USB后就能在PhoenixSuit中看到设备。选择编译好的img文件,点击升级即可。
如果烧录后设备无法启动,首先检查串口输出。全志芯片通常都有UART调试接口,通过USB转串口工具连接后,用minicom或者screen就能看到启动日志:
sudo screen /dev/ttyUSB0 115200
启动日志能提供很多调试信息,比如内核panic、驱动加载失败等。根据错误信息再回头修改代码重新编译。
还有一个有用的技巧是生成编译数据库,方便用IDE进行代码导航和分析:
make COMPILER=clang compile_commands.json
这个文件可以被VS Code、Clion等IDE识别,实现代码跳转、自动补全等功能,大大提升开发效率。
网硕互联帮助中心



评论前必须登录!
注册