云计算百科
云计算领域专业知识百科平台

全志Tina SDK编译环境搭建与常见问题解决

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识别,实现代码跳转、自动补全等功能,大大提升开发效率。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 全志Tina SDK编译环境搭建与常见问题解决
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!