海思SDK编译环境搭建:Ubuntu 16.04下3个常见编译错误分析与解决
第一次接触海思SDK的开发者,往往会在环境搭建阶段遇到各种"拦路虎"。Ubuntu 16.04作为官方推荐的开发环境,虽然兼容性最佳,但在实际编译osdrv和rootfs时,仍会出现工具链路径、依赖库缺失、权限问题等典型错误。本文将结合HI3518E开发经验,手把手带你排查这些"坑",并提供可直接复用的解决方案。
1. 环境准备阶段的"隐形杀手"
在开始编译前,90%的问题都源于环境配置不当。以下是新手最容易忽略的三个关键点:
工具链路径配置误区
海思SDK通常配套提供交叉编译工具链,但官方文档往往不会告诉你路径设置的细节。错误的配置会导致后续所有编译命令失效:
# 错误示例:直接复制文档中的路径
export PATH=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH
# 正确做法:先确认实际解压路径
ls /opt/hisi-linux/x86-arm/ # 查看实际存在的目录名
export PATH=$(find /opt -name "arm-himix200-linux-gcc" | xargs dirname):$PATH
提示:使用
find命令定位工具链可执行文件,比手动输入更可靠。记得将最终路径加入.bashrc永久生效。
依赖库的完整清单
Ubuntu 16.04默认缺少的依赖库远比文档列出的多,以下是实测必需的扩展清单:
# 基础依赖(官方提及)
sudo apt-get install lib32z1 libncurses5-dev
# 隐藏依赖(官方未说明但编译会报错)
sudo apt-get install g++-multilib uuid-dev libjpeg-dev libssl-dev
用户权限的坑
即使使用sudo,某些环境变量也不会继承。建议全程用普通用户操作,仅在安装依赖时临时提权。遇到权限问题时,可检查:
# 检查当前用户对SDK目录的权限
namei -l $(pwd)/osdrv
# 递归修改所属权(避免使用chmod 777)
sudo chown -R $USER:$USER /path/to/sdk
2. osdrv编译中的三大经典错误
2.1 工具链调用失败(Error: No such file or directory)
这个看似简单的报错,实际可能由多种原因导致:
动态链接库缺失
即使工具链路径正确,32位工具链在64位系统上仍可能缺少库支持:
# 检查缺失的库
ldd $(which arm-himix200-linux-gcc)
# 安装兼容库(针对Ubuntu 16.04)
sudo apt-get install lib32stdc++6 lib32z1
案例对比表 :
| 错误现象 | 真实原因 | 解决方案 |
|---|---|---|
arm-himix200-linux-gcc: not found
| PATH未生效或路径错误 |
使用
find
定位真实路径
|
error while loading shared libraries
| 缺少32位运行库 | 安装lib32stdc++6等兼容包 |
Permission denied
| 解压时权限丢失 | 用普通用户重新解压SDK |
2.2 kernel编译时的头文件冲突
当出现
fatal error: openssl/opensslv.h: No such file or directory
等头文件错误时:
# 创建符号链接欺骗编译系统
cd osdrv/opensource/kernel
ln -s /usr/include/openssl include/linux/openssl
# 更彻底的解决方案是修改Makefile
sed -i 's/EXTRA_CFLAGS/EXTRA_CFLAGS -I\/usr\/include/' Makefile
原理分析
:
海思的kernel配置默认开启了加密模块,但未正确包含系统openssl头文件路径。上述操作相当于给编译器添加了一个"路标"。
2.3 rootfs制作时的空间不足
即使磁盘空间充足,制作jffs2镜像时仍可能报错:
# 错误示例
mkfs.jffs2: error!: write failed at 0x00400000 (No space left on device)
# 解决方案:调整擦除块大小参数
./mkfs.jffs2 -d rootfs -l -e 0x20000 -o rootfs_64k.jffs2
关键参数说明:
-
-e 0x20000:将擦除块大小从默认64KB改为128KB -
-l:使用小端模式(必须与uboot配置一致)
3. 自动化检查脚本与速查表
3.1 环境检查脚本
将以下脚本保存为
check_env.sh
,可一键诊断环境问题:
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
check_toolchain() {
if ! which arm-himix200-linux-gcc >/dev/null; then
echo -e "${RED}[ERROR] Toolchain not found in PATH${NC}"
echo "Try: export PATH=\$(find /opt -name "arm-himix200-linux-gcc" | xargs dirname):\$PATH"
return 1
fi
echo -e "${GREEN}[OK] Toolchain detected${NC}"
return 0
}
check_libs() {
local missing=()
for lib in lib32z1 libncurses5-dev g++-multilib uuid-dev; do
if ! dpkg -l | grep -q $lib; then
missing+=($lib)
fi
done
if [ ${#missing[@]} -ne 0 ]; then
echo -e "${RED}[ERROR] Missing libraries: ${missing[@]}${NC}"
echo "Run: sudo apt-get install ${missing[@]}"
return 1
fi
echo -e "${GREEN}[OK] All required libraries installed${NC}"
return 0
}
check_kernel_headers() {
if [ ! -f /usr/include/openssl/opensslv.h ]; then
echo -e "${RED}[WARN] openssl headers not found${NC}"
echo "Consider: sudo apt-get install libssl-dev"
else
echo -e "${GREEN}[OK] Kernel headers check passed${NC}"
fi
}
check_toolchain
check_libs
check_kernel_headers
3.2 错误速查表
| 错误代码 | 可能原因 | 快速解决 |
|---|---|---|
make: arm-himix200-linux-gcc: Command not found
| 工具链路径错误 |
运行
find /opt -name arm-himix200-linux-gcc
定位
|
fatal error: ncurses.h: No such file or directory
| 缺少开发库 |
sudo apt-get install libncurses5-dev
|
mkfs.jffs2: failed to write eraseblock
| 闪存布局不匹配 |
调整
-e
参数与uboot的
eraseblock
大小一致
|
uboot烧写后无输出
| SPI Flash时钟配置错误 |
在uboot源码中修改
CONFIG_HI_SPI_CLK
值
|
4. 进阶:编译优化与验证技巧
并行编译加速
在
osdrv/Makefile
中添加:
# 启用多核编译(根据CPU核心数调整)
MAKE_JOBS := $(shell grep -c ^processor /proc/cpuinfo)
make -j$(MAKE_JOBS)
烧写验证三板斧
-
uboot阶段
:通过
sf probe 0确认Flash识别正常 - kernel阶段 :观察解压日志是否完整
-
rootfs阶段
:检查
/etc/init.d下的启动脚本权限
调试金句
:
当遇到玄学问题时,尝试:
make clean # 清理旧编译
sync # 确保磁盘写入
sudo reboot now # 重启解决环境残留
海思平台的编译过程就像解谜游戏,每个错误都是线索。掌握这些实战技巧后,你会发现环境搭建不过是嵌入式开发的第一个小关卡。

2055

被折叠的 条评论
为什么被折叠?



