首先我们通过 ctrl+alt+t,进入Tina-linux下的目录中,在终端执行以下命令
bash
source build/envsetup.sh

此时说明可以进行下一步选择硬件方案,输入
bash
lunch
在这里,会让你选择你的板级硬件,根据你的开发板进行选择,我这里选择的是6

选择好后就可以进行编译了
bash
make
在执行 make 过程中,由于 Ubuntu 系统版本较新,我在这里用的是22版本,会导致与 Tina 旧版构建工具链产生兼容性问题。以下是我按顺序遇到的错误及修复方案。
错误一:编译链依赖缺失 (Prerequisite check failed)
现象:
Prerequisite check failed. Use FORCE=1 to override. make[1]: *** [prepare-tmpinfo] Error 2
原因: 宿主机缺少构建所需的必要库文件。
修复: 安装缺失的依赖库(包括旧版 python):
Bash
sudo apt install libncurses5-dev gawk python2 python-is-python2
错误二:m4 工具报错 (SIGSTKSZ 变量问题)
现象:
c-stack.c:55:26: error: missing binary operator before token "(" #elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
原因: Tina 内置的 m4-1.4.18 较老,假设 SIGSTKSZ 是常数。但 Ubuntu 22.04 使用的新版 Glibc 2.34+ 将其改为了变量,导致预处理器无法处理。
修复: 修改文件:out/<你的方案名>/compile_dir/host/m4-1.4.18/lib/c-stack.c 找到第 55 行左右:
C
#elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
修改为:
C
#elif HAVE_LIBSIGSEGV && 0
错误三:eyesee-mpp 平台未定义 (Fatal Error)
现象:
ERROR: please fix package/allwinner/eyesee-mpp/middleware/Makefile Makefile:42: *** fatal error! sun8iw20p1 is not support by eyesee-mpp!. Stop.
原因: 全志 MPP 中间件的 Makefile 中没有包含当前芯片平台(如 sun8iw20p1 / V853)的判断逻辑,导致落入 else 分支报错。
修复: 修改 package/allwinner/eyesee-mpp/middleware/Makefile。 需要修改两处逻辑:
-
添加源码路径定义(约第 40 行):
Makefile
# ... 在 else ifeq ($(TARGET_BOARD_PLATFORM),sun20iw1p1) 之后添加 ... else ifeq ($(TARGET_BOARD_PLATFORM),sun8iw20p1) MPPCFG_CHIP := sun8iw20p1 # ...(注:如果这里是判断 TARGET_CHIP 设置 SRC_CODE_DIR,则需对应修改,保持上下文一致)
-
添加芯片代号定义(文件底部):
Makefile
# ... 在 else ifeq ($(TARGET_CHIP), sun8iw21p1) 之后添加 ... else ifeq ($(TARGET_CHIP), sun8iw20p1) MPPCFG_CHIP := sun8iw20p1 # ...
注意:如果 dragonboard 目录报错,需同样方法修改 package/allwinner/eyesee-mpp/dragonboard/Makefile。
错误四:menuconfig 无法启动 (缺少 libncurses.so.5)
现象:
scripts/config/mconf: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
原因: 系统默认安装的是 libncurses6,而 Tina 的配置工具依赖旧版 libncurses5。
修复:
Bash
sudo apt-get install libncurses5 libncursesw5
错误五:mklibs C++ 标准兼容性错误
现象:
elf.hpp:52:56: error: ISO C++17 does not allow dynamic exception specifications throw (std::out_of_range)
原因: 宿主机的 C++ 编译器(GCC)版本过高(默认 C++17),而 mklibs 源码使用了 C++17 已移除的 throw(...) 动态异常规范。
修复:
-
修改
tools/mklibs/Makefile,强制指定使用 C++98 标准。 在include $(BUILD_DIR)/host-build.mk之前添加:Makefile
HOST_CPPFLAGS += -std=gnu++98 -
清理并重编该工具(必须执行):
Bash
make tools/mklibs/clean make tools/mklibs/compile make tools/mklibs/install
错误六:fakeroot Glibc 兼容性错误 (_STAT_VER)
现象: 在编译过程中报错(通常被多核编译日志掩盖,需 -j1 查看):
libfakeroot.c:99:40: error: '_STAT_VER' undeclared (first use in this function)
原因: Ubuntu 22.04 使用的新版 Glibc 移除了 _STAT_VER 宏定义,而旧版 fakeroot 源码依赖该定义。
修复:
-
找到源码文件(位于编译临时目录):
Bash
find out -name libfakeroot.c # 通常路径为 out/<方案名>/compile_dir/host/fakeroot-1.20.2/libfakeroot.c -
编辑该文件,在文件开头(
#include之后,第一个#define之前)插入:C
#ifndef _STAT_VER #define _STAT_VER 0 #endif -
注意: 修改后直接继续
make -j8即可,无需清除,因为这是在out目录下的临时修改。
错误七:squashfskit4 GCC 10+ 兼容性错误 (多重定义)
现象:
/usr/bin/ld: read_fs.o:(.bss+0x0): multiple definition of
bwriter_buffer; mksquashfs.o:(.bss+0x0): first defined here collect2: error: ld returned 1 exit status
原因: GCC 10 及以上版本默认开启 -fno-common,导致全局变量在多个文件中被重复定义时报错。旧代码需要 -fcommon 行为。
修复:
-
修改
tools/squashfskit4/Makefile。 -
找到
define Host/Compile部分,在EXTRA_CFLAGS中追加-fcommon:Makefile
# 原代码可能为: EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include" # 修改为: EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include -fcommon" -
清理并重编:
Bash
make tools/squashfskit4/clean make tools/squashfskit4/install
错误八:内核插件编译缺失 GMP 库
现象:
fatal error: gmp.h: No such file or directory make[7]: *** [scripts/gcc-plugins/arm_ssp_per_task_plugin.o] Error 1
原因: 编译 Linux 内核的 GCC 插件需要宿主机安装 GMP、MPC、MPFR 等数学库的开发头文件。
修复:
Bash
sudo apt-get install libgmp-dev libmpc-dev libmpfr-dev
错误九:e2fsprogs 函数重定义 (copy_file_range)
现象: (这是 Ubuntu 22.04 必现错误,建议预防性修复) 报错提示 copy_file_range 被重定义或冲突。
原因: 新版 Glibc 已经内置了 copy_file_range 函数,与 e2fsprogs 源码中的定义冲突。
修复:
-
修改
tools/e2fsprogs/Makefile。 -
在
CONFIGURE_ARGS +=配置块末尾追加禁用选项:Makefile
CONFIGURE_ARGS += \ ... (前面的配置) \ --disable-fsck \ --disable-copy-file-range -
清理并重编:
Bash
make tools/e2fsprogs/clean # 之后继续主编译流程
在修修补补以上的所有代码后,终于提示编译通过了
bash
Generating package index...
Signing key has not been configured
make[2]: Leaving directory '/home/eric/Tina-Linux'
make[1]: Leaving directory '/home/eric/Tina-Linux'
[2]+ 已完成 $T/tools/build/buildserver --path $T 2> /dev/null 1>&2
#### make completed successfully (27:08 (mm:ss)) ####
但是很遗憾最后打包的时候也会报错,所以如果你是在linux上,最好使用下一个方法,除非你真的很想折腾
使用docket进行编译
使用 Docker 容器构建一个隔离的 Ubuntu 18.04 环境,可以完美避开所有依赖和语法版本问题,且无性能损耗。
步骤一:准备环境配置
在宿主机建立目录 ~/tina-docker 并创建 Dockerfile:
Dockerfile
# 使用官方 Ubuntu 18.04 作为基底
FROM ubuntu:18.04
# 设置非交互模式,防止安装过程中出现时区选择卡死
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
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 \
python \
python-dev \
time \
sudo \
wget \
vim \
rsync \
libgmp-dev \
libmpc-dev \
libmpfr-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# 3. 【关键修改】全局设置环境变量
# 使用 ENV 指令,比修改 .bashrc 更稳定,确保 tar/configure 脚本一定能读到
ENV FORCE_UNSAFE_CONFIGURE=1
# 4. 【额外优化】解决 Git 目录权限报错
# 防止出现 fatal: detected dubious ownership in repository at '/work'
RUN git config --global --add safe.directory "*"
# 5. 设置工作目录
WORKDIR /work
# 6. 设置默认 shell 为 bash
CMD ["/bin/bash"]
步骤二:构建镜像
在 Dockerfile 所在目录下执行:
Bash
# 构建一个名为 tina-build-env 的镜像
docker build -t tina-build-env .
步骤三:启动容器并挂载 SDK
将宿主机的 SDK 源码目录映射到容器内部。
- 宿主机路径:
/media/eric/Lee/Tina-Linux - 容器内路径:
/work
Bash
docker run -it \
--name tina-compile \
-v /media/eric/Lee/Tina-Linux:/work \
tina-build-env
步骤四:在容器内编译 (
进入容器后,执行标准的编译流程:
Bash
source build/envsetup.sh
lunch # 选择对应的板型方案
make -j$(nproc)
mboot
pack # 打包固件
经历以上的一大圈折腾,也是得到了想要的结果
bash
Generating package index...
Signing key has not been configured
make[2]: Leaving directory '/work'
make[1]: Leaving directory '/work'
[2]+ Done $T/tools/build/buildserver --path $T 2> /dev/null 1>&2
#### make completed successfully (27:14 (mm:ss)) ####
bash
Add partion very rootfs.fex ROOTFS_FEX000000
FilePath: rootfs.fex
FileLength=3880000BuildImg 0
Dragon execute image.cfg SUCCESS !
----------image is for nand/emmc----------
----------image is at----------
/work/out/t113-bingpi_m2/tina_t113-bingpi_m2_uart3.img
pack finish
root@836ad8cce666:/work#
最后
docket启动命令
bash
docker start -ai tina-compile