海思SS626 SDK编译全流程:从环境搭建到镜像生成实战指南

发布时间:2026/7/31 3:13:10
海思SS626 SDK编译全流程:从环境搭建到镜像生成实战指南 1. 项目概述与核心价值最近在折腾海思SS626平台的开发板从拿到SDK到最终编译出完整的文件系统镜像整个过程可以说是一波三折。网上关于海思平台特别是SS626这类较新芯片的资料远不如老牌的Hi3516、Hi3519那么丰富和系统。很多朋友卡在环境搭建和编译报错上一折腾就是好几天。这篇文章我就把自己从零开始编译整个海思SS626 SDK的全过程以及踩过的所有坑和解决方案做一个详细的复盘。无论你是刚接触海思平台的新手还是从其他海思芯片迁移过来的老手希望这份实录能帮你节省大量摸索的时间。海思SS626是一款面向边缘计算和智能视觉应用的高性能SoC其SDK包通常包含了U-Boot、Kernel、根文件系统以及丰富的媒体处理中间件和样例代码。编译整个SDK意味着要搭建一个完整的交叉编译环境并让这一套复杂的构建系统顺利跑起来最终生成可以烧录到开发板上的固件。这个过程不仅是对Linux操作和构建工具链的考验更是对耐心和问题排查能力的磨练。接下来我会从环境准备开始一步步拆解每个环节的操作要点和背后的原理。2. 开发环境准备与深度解析编译海思SDK的第一步也是最重要的一步就是准备一个正确且纯净的编译环境。很多编译错误其根源都出在环境上。2.1 操作系统与基础依赖海思官方推荐使用Ubuntu 16.04或18.04的64位版本作为编译主机。我强烈建议在物理机或虚拟机中安装一个纯净的Ubuntu 18.04。使用Windows的WSL或者过于新的Ubuntu版本如20.04、22.04可能会遇到各种诡异的库版本兼容性问题尤其是glibc的版本冲突后期排查起来极其痛苦。在安装好Ubuntu系统后第一件事就是更新源并安装一系列基础开发工具和库。这些是构建任何大型C/C项目的基础。sudo apt-get update sudo apt-get upgrade -y # 安装编译必备工具 sudo apt-get install -y build-essential cmake git wget cpio # 安装可能需要的库文件 sudo apt-get install -y libssl-dev libncurses-dev libc6-i386 lib32z1 lib32stdc6 # 安装Python相关SDK中一些脚本可能需要 sudo apt-get install -y python python2.7 python3 python3-pip # 确保有较新版本的make sudo apt-get install -y make这里需要特别注意的是lib32z1和lib32stdc6这两个包。因为海思的交叉编译工具链是32位的arm-himix200-linux在64位系统上运行需要32位运行库的支持。如果没有安装在后续运行arm-himix200-linux-gcc时会报错“No such file or directory”这个错误提示非常具有迷惑性会让你以为是工具链路径错了其实是缺少32位兼容库。2.2 获取与部署官方SDK及工具链海思的SDK和交叉编译工具链通常由芯片代理商或方案提供商提供。你会拿到一个庞大的压缩包名字可能类似HiSS626V100_SDK_Vx.x.x.x.tgz。工具链则可能单独提供或者已经包含在SDK包的osdrv/opensource/toolchain目录下。第一步解压SDK选择一个空间充足的路径建议至少预留50GB解压SDK包。注意解压路径绝对不能包含中文或空格这是很多构建系统的通病。mkdir -p ~/hisilicon tar -zxf HiSS626V100_SDK_Vx.x.x.x.tgz -C ~/hisilicon/ cd ~/hisilicon # 通常解压后会有一个版本号目录进入并执行官方部署脚本 cd HiSS626V100_SDK_Vx.x.x.x ./sdk.unpack执行sdk.unpack脚本是关键。这个脚本会进一步解压SDK内部的多个子压缩包并将文件放置到预设的目录结构中去。一定要确保这个脚本执行成功没有报错。第二步安装交叉编译工具链工具链的安装是核心。假设工具链包是arm-himix200-linux.tar.gz。# 通常建议将工具链安装在/opt目录下 sudo tar -zxf arm-himix200-linux.tar.gz -C /opt/安装后工具链的路径通常是/opt/hisi-linux/x86-arm/arm-himix200-linux/bin。我们需要将工具链路径加入到系统的PATH环境变量中并设置相关的环境变量。第三步配置环境变量最可靠的方法不是直接修改/etc/profile而是为当前编译会话创建一个环境变量脚本。在SDK根目录下创建一个setenv.sh文件#!/bin/bash export ARCHarm export CROSS_COMPILEarm-himix200-linux- export PATH/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH export HISI_SDK_PATH$(pwd) echo 交叉编译环境已设置 echo ARCH$ARCH echo CROSS_COMPILE$CROSS_COMPILE echo TOOLCHAIN PATH$(which arm-himix200-linux-gcc)然后在每次打开终端进行编译前先执行source setenv.sh来激活环境。这样做的好处是环境隔离不会影响系统其他用途也避免了因全局环境变量设置错误导致系统命令出错的风险。注意务必验证工具链是否安装成功。执行arm-himix200-linux-gcc -v应该能正确输出gcc的版本信息可能是6.3.0或类似版本。如果提示命令未找到请检查PATH如果提示“bash: /opt/.../arm-himix200-linux-gcc: No such file or directory”则大概率是上文提到的32位库缺失问题。3. SDK目录结构与编译框架解读在开始编译前花点时间理解SDK的目录结构能让你在遇到问题时快速定位。一个典型的海思SS626 SDK目录结构如下HiSS626V100_SDK_Vx.x.x.x/ ├── osdrv/ # 操作系统驱动层编译核心 │ ├── opensource/ # 开源软件包busybox, kernel, uboot等 │ ├── pub/ # 编译输出目录生成的镜像文件在这里 │ └── tools/ # 打包、烧录等工具 ├── mpp/ # 媒体处理平台包含音视频编解码、ISP等库和样例 ├── middleware/ # 中间件可能包含安全、图形等组件 ├── component/ # 组件层 └── sdk.clean # 清理脚本 └── sdk.unpack # 部署脚本整个SDK的编译入口通常位于osdrv目录下。海思采用了一种“分步编译统一制作”的思路。我们不需要手动依次去编译uboot、kernel、rootfs而是通过osdrv目录下的Makefile来驱动整个流程。核心的编译命令序列一般如下cd osdrv/ make all BOOT_MEDIAspi AMP_TYPElinux_arm这里的BOOT_MEDIA指定启动介质spi nand, emmc, spi nor等AMP_TYPE指定系统类型单系统linux或双系统等。这些参数必须根据你手中开发板的硬件设计来填写错误的参数会导致编译出的镜像无法启动。如果你不确定一定要咨询板卡提供商或查阅硬件手册。4. 全流程编译实操与问题攻坚现在我们进入最核心的编译环节。我将按照编译的实际顺序分解每一步并插入我遇到过的典型问题。4.1 编译U-BootU-Boot是系统的引导程序。在osdrv目录下执行make all时第一步就是编译uboot。常见问题1fatal error: openssl/evp.h: No such file or directory这是因为编译uboot时需要使用openssl的头文件来支持某些加密功能但系统缺少开发包。解决方案sudo apt-get install -y libssl-dev安装后清理uboot并重新编译cd osdrv/opensource/uboot/u-boot-2016.11/ make distclean cd ../../../ make uboot BOOT_MEDIAspi # 可以单独编译uboot模块常见问题2arm-himix200-linux-gcc: not found虽然你设置了环境变量但可能在makefile的子进程环境中未生效。请确保在osdrv目录下先source你的setenv.sh。检查osdrv/tools/pc_tools/arm-himix200-linux这个符号链接是否正确指向了/opt/hisi-linux/x86-arm/arm-himix200-linux。有时SDK部署脚本会创建这个链接如果链接失效或指向错误需要手动修正cd osdrv/tools/pc_tools rm -rf arm-himix200-linux ln -s /opt/hisi-linux/x86-arm/arm-himix200-linux ./实操心得编译uboot相对独立建议先尝试单独编译make uboot成功后再进行全编译。编译成功后在osdrv/pub/目录下会生成u-boot-hi6261.bin具体名字可能因芯片而异等文件。4.2 编译Linux内核内核编译是问题高发区因为它涉及大量的驱动配置和内核选项。常见问题3Can‘t find default configuration “arch/arm/configs/ss626v100_emmc_defconfig”!这个错误表明在指定AMP_TYPE和BOOT_MEDIA的组合下SDK中可能没有预置对应的默认内核配置文件。海思SDK的内核配置通常放在osdrv/opensource/kernel/linux-4.9.y/arch/arm/configs/目录下。解决方案首先去上述目录查看是否存在与你板卡匹配的defconfig文件例如ss626v100_spi_defconfig。如果存在你可能需要修改osdrv/Makefile或osdrv/products/目录下对应板型的mk文件指定正确的配置名。这是一个需要仔细对照SDK文档或已有配置的细致活。如果不存在最直接的方法是使用一个最接近的配置比如hi6261_defconfig然后在此基础上通过make menuconfig手动调整。但这需要你对内核和硬件有较深了解。常见问题4编译过程中大量undefined reference错误尤其是与openssl或libcrypto相关这通常发生在编译内核模块或某些内置驱动时。根本原因是内核构建系统在链接时找不到正确的库。解决方案确认交叉编译工具链的库路径/opt/hisi-linux/.../arm-himix200-linux/lib是否包含所需的库文件如libcrypto.so。检查内核的.config文件搜索CONFIG_CRYPTO_*选项。有时海思内核会依赖自己修改过的openssl可能需要从SDK的其他地方如component/openssl先编译并安装到工具链的sysroot中。这是一个深水区可能需要查阅SDK中专门的readme。实操心得在第一次编译时建议使用SDK默认提供的、经过验证的defconfig文件不要急于修改内核配置。编译内核模块时确保环境变量INSTALL_MOD_PATH指向了你的根文件系统目录以便make modules_install能将模块安装到正确位置。4.3 构建根文件系统海思SDK通常使用BusyBox来制作基础的根文件系统。常见问题5/bin/sh: makedevs: not found在制作根文件系统镜像jffs2或ext4时makedevs工具用于在镜像中创建设备节点。这个工具由BusyBox生成如果它不在你的主机系统PATH中或者编译BusyBox时未生成就会报错。解决方案确保BusyBox已成功编译。进入osdrv/opensource/busybox/busybox-1.26.2执行make和make install。编译生成的_install目录下会有makedevs。可以将这个路径临时加入PATH或者更常见的做法是SDK的Makefile会自动处理。如果出错检查osdrv/tools/pc_tools/mkfs目录下是否有该工具或者检查osdrv/Makefile中关于makedevs路径的设置。常见问题6文件系统镜像制作失败提示空间不足在制作jffs2镜像时需要指定擦除块大小-e和页面大小-s。如果参数设置与你的SPI NAND Flash物理参数不匹配会导致后续烧录后系统无法挂载根文件系统。解决方案 这些参数通常在osdrv/Makefile或板型相关的mk文件中通过变量定义例如FLASH_TYPE : spi-nand和BLOCK_SIZE : 0x20000。你必须根据开发板Flash的数据手册来确认这些参数。一个错误的-e 0x20000128KB设置用在256KB擦除块的Flash上就会导致灾难性后果。4.4 编译MPP媒体处理平台MPP是海思芯片的灵魂提供了音视频编解码、ISP、IVE等硬件加速接口。常见问题7sample_venc.c: fatal error: hi_comm_venc.h: No such file or directory编译MPP样例时找不到头文件。这是因为MPP的编译通常需要先编译并安装其库文件将头文件和库文件部署到交叉编译工具链的sysroot中或者至少要让样例的Makefile能找到它们。解决方案 MPP目录下通常有自己的编译说明。标准的步骤是cd mpp/ make clean make all make installmake install这一步非常关键它会将编译好的lib*.so和头文件拷贝到SDK目录下的某个out文件夹或者直接安装到工具链路径。之后样例程序的Makefile会通过相对路径或环境变量如CFLAGS -I../../include来引用这些头文件和库。常见问题8样例程序链接失败undefined reference to ‘HI_MPI_XXX’这表示链接器找不到MPI媒体编程接口库函数的具体实现。解决方案确认make install确实成功安装了库文件到预期目录例如/opt/hisi-linux/.../arm-himix200-linux/lib或mpp/lib。检查样例的Makefile中的LDFLAGS是否正确地通过-L指定了库文件路径并通过-l链接了具体的库如-lmpi -lhdmi -l...。使用arm-himix200-linux-readelf -d sample_venc查看编译出的样例程序依赖的库确认路径是否正确。5. 系统镜像打包与最终验证当uboot、kernel、rootfs都编译成功后最后一步是打包生成可用于烧录的完整镜像。在osdrv/pub/目录下你会找到各个镜像文件u-boot-ss626v100.bin: U-Boot镜像。ss626v100-uart0-Image: 内核镜像。rootfs_ss626v100_64k.jffs2或rootfs_ss626v100.ext4: 根文件系统镜像。海思通常还提供一个mkimage.sh或update.sh脚本用于将这些单独的镜像打包成一个整体的update.img方便通过SD卡或USB进行升级。这个脚本可能会调用osdrv/tools/pc_tools下的工具如mkfs.jffs2、mkimage等。最终验证步骤文件完整性检查确认生成的镜像文件大小合理非0字节。烧录测试使用海思的Hitool或串口工具将镜像烧录到开发板。串口日志分析连接串口调试工具上电观察启动日志。成功的日志会依次显示U-Boot启动、内核解压、挂载根文件系统最后进入登录提示符。功能测试登录系统后可以尝试运行一个简单的MPP样例程序验证核心的媒体功能是否正常。6. 进阶问题排查与调试技巧即使按照上述流程走完你可能还是会遇到一些独特的问题。这里分享几个高阶的排查思路。问题排查技巧1如何精准定位编译错误当make报错时不要只看最后几行。从错误信息的最开始向上阅读找到第一个真正的错误通常是第一个error:或fatal error:。后面的错误很可能是由第一个错误引发的连锁反应。对于链接错误使用grep在源码和Makefile中搜索未定义的符号看它属于哪个库或哪个源文件。问题排查技巧2make clean与make distclean的区别make clean清除当前配置下编译生成的目标文件.o和中间文件但保留配置文件.config。make distclean/make mrproper内核清除所有编译生成的文件包括配置文件恢复到源码最初状态。 当你更换了板型配置BOOT_MEDIA或进行了重大修改后建议执行make distclean然后从头开始配置和编译避免残留文件导致奇怪问题。问题排查技巧3并行编译加速与风险使用make -j$(nproc)可以利用多核CPU大幅加速编译过程。但是对于海思SDK这种复杂且各部分依赖关系有时不那么清晰的项目并行编译可能会引发一些时序问题导致编译失败。如果遇到难以解释的编译失败可以尝试去掉-j参数用单线程编译一次以排除并行编译带来的干扰。问题排查技巧4版本管理强烈建议在SDK解压并成功执行sdk.unpack后对整个SDK目录进行一次初始的git提交git init git add . git commit -m “init”。这样在你修改任何文件如Makefile、配置文件之前都有一个干净的基准。一旦修改导致编译失败你可以轻松地使用git diff查看修改了哪里或者用git checkout -- file回退单个文件。编译海思SS626的SDK是一个系统工程它考验的不仅仅是输入命令的能力更是对环境、工具链、构建系统以及硬件规格的理解。每一个报错信息都是线索耐心阅读官方文档尽管可能不完善、善用搜索引擎、并与社区交流是解决问题的关键。希望这份详尽的记录能成为你攻克SS626开发环境搭建难关的一块坚实垫脚石。