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
相关推荐
WG_174 小时前
Linux:进程地址空间
linux
番茄迷人蛋4 小时前
后端项目服务器部署
java·运维·服务器·spring
LILR_4 小时前
简单学docker
运维·docker·容器
Blossom.1184 小时前
基于多模态大模型的工业质检系统:从AOI到“零样本“缺陷识别的产线实践
运维·人工智能·python·机器学习·自动化·测试用例·知识图谱
Xの哲學4 小时前
Linux MAC层实现机制深度剖析
linux·服务器·算法·架构·边缘计算
奇点爆破XC4 小时前
centos进阶命令.Linux系统介绍(运维版)
linux·运维·centos
南棱笑笑生4 小时前
20251215给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通typeC1接口
linux·c语言·开发语言·rockchip
tianyuanwo4 小时前
深度解析:Linux ISO引导配置与安装模式设计
linux·uefi·iso·isolinux.cfg·grub.cfg
就是有点傻4 小时前
如何创建一个WebApi服务端
服务器·c#