Tina Linux SDK编译SDK-linux环境下实现

首先我们通过 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。 需要修改两处逻辑:

  1. 添加源码路径定义(约第 40 行):

    Makefile

    复制代码
    # ... 在 else ifeq ($(TARGET_BOARD_PLATFORM),sun20iw1p1) 之后添加 ...
    else ifeq ($(TARGET_BOARD_PLATFORM),sun8iw20p1)
        MPPCFG_CHIP := sun8iw20p1
    # ...

    (注:如果这里是判断 TARGET_CHIP 设置 SRC_CODE_DIR,则需对应修改,保持上下文一致)

  2. 添加芯片代号定义(文件底部):

    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(...) 动态异常规范。

修复:

  1. 修改 tools/mklibs/Makefile,强制指定使用 C++98 标准。 在 include $(BUILD_DIR)/host-build.mk 之前添加:

    Makefile

    复制代码
    HOST_CPPFLAGS += -std=gnu++98
  2. 清理并重编该工具(必须执行):

    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 源码依赖该定义。

修复:

  1. 找到源码文件(位于编译临时目录):

    Bash

    复制代码
    find out -name libfakeroot.c
    # 通常路径为 out/<方案名>/compile_dir/host/fakeroot-1.20.2/libfakeroot.c
  2. 编辑该文件,在文件开头(#include 之后,第一个 #define 之前)插入:

    C

    复制代码
    #ifndef _STAT_VER
     #define _STAT_VER 0
    #endif
  3. 注意: 修改后直接继续 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 行为。

修复:

  1. 修改 tools/squashfskit4/Makefile

  2. 找到 define Host/Compile 部分,在 EXTRA_CFLAGS 中追加 -fcommon

    Makefile

    复制代码
    # 原代码可能为: EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include"
    # 修改为:
    EXTRA_CFLAGS="-I$(STAGING_DIR_HOST)/include -fcommon"
  3. 清理并重编:

    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 源码中的定义冲突。

修复:

  1. 修改 tools/e2fsprogs/Makefile

  2. CONFIGURE_ARGS += 配置块末尾追加禁用选项:

    Makefile

    复制代码
    CONFIGURE_ARGS += \
        ... (前面的配置) \
        --disable-fsck \
        --disable-copy-file-range
  3. 清理并重编:

    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
相关推荐
Yana.nice1 天前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月1 天前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
想逃离铁厂的老铁1 天前
Day55 >> 并查集理论基础 + 107、寻找存在的路线
java·服务器
小白跃升坊1 天前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey1 天前
【Linux】线程同步与互斥
linux·笔记
杨江1 天前
seafile docker安装说明
运维
舰长1151 天前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀1 天前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng1 天前
Linux 输出重定向
linux·运维
路由侠内网穿透.1 天前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居