编译构建指南
本文档介绍 fw-AD16N_GP-MCU_SDK(杰理 AD16N 系列通用 MCU SDK)的完整编译构建流程:环境搭建、工具链安装、三种编译方式(Code::Blocks / Makefile / VS Code)、编译产物与常见编译错误排查。
Purpose and Scope
本页面向首次接触 AD16N SDK 的开发者,说明如何把仓库源码编译为可烧录的固件,包括:
- 编译前置条件与杰理工具链(
clang)的安装与验证 - Code::Blocks、Makefile 命令行、VS Code 三种编译方式的详细步骤
- 工程结构(
sdk/下的 Makefile、.cbp工程、post_build/后处理脚本) - 编译命令速查、常见编译错误与解决办法
- 编译产物的去向(
post_build/目录)与下一步烧录指引
不在本页范围内(由兄弟页面 / README 对应章节承载):
- 固件烧录、生产烧写与 OTA 升级 —— 详见「烧录与升级」相关页面
app_config.h功能开关与芯片型号配置 —— 详见「配置说明」相关页面- 应用功能开发(mbox_flash 应用内部实现)—— 详见应用开发相关页面
Overview
AD16N 是杰理科技的 32 位音频 MCU 系列(AD160A/AD161A/AD162A/AD165A/AD166A/AD168A 等),SDK 采用 源码(apps/)+ 预编译库(include_lib/liba/ 下的 .a 文件) 的交付模式:应用层代码开源可改,底层解码/编码/驱动以库形式提供。因此编译必须使用与库匹配的杰理编译工具链,且需在 sdk/ 根目录下进行。
仓库的构建体系同时支持三种入口,核心都是调用同一个底层构建系统(顶层 Makefile + 杰理 clang 交叉编译工具链):
| 入口 | 适用场景 | 触发方式 |
|---|---|---|
Code::Blocks(.cbp 工程) | Windows 用户,IDE 图形化编译 | Build → Build(Ctrl+F9) |
| Makefile 命令行 | Windows / Linux 用户,脚本化 / CI | make -j4 |
| VS Code | 已预配置任务 | Ctrl+Shift+B |
无论哪种方式,最终产物都在 sdk/apps/app/post_build/ 目录下生成,供 USB 升级工具烧录。默认应用工程为 AD16N_mbox_flash.cbp(小音箱/音频播放应用,代码位于 sdk/apps/app/src/mbox_flash/)。
Architecture
下图展示 SDK 构建体系的整体架构:三种编译入口如何汇聚到同一套构建系统,以及从源码到固件的完整链路。
flowchart TD
subgraph sg_Entry["编译入口 (sdk/ 根目录)"]
CB["Code::Blocks<br/>AD16N_mbox_flash.cbp"]
MK["Makefile 命令行<br/>make -j4"]
VS["VS Code 任务<br/>Ctrl+Shift+B"]
end
subgraph sg_Build["构建系统"]
BAT["make_prompt.bat<br/>环境变量 + make 路径"]
MAKE["顶层 Makefile<br/>target 选择芯片型号"]
TOOLCHAIN["杰理编译工具链<br/>clang (pi32)"]
end
subgraph sg_Src["源码与库"]
APP["apps/app/src/mbox_flash<br/>应用源码"]
LIB["apps/include_lib/liba<br/>预编译 .a 库"]
CFG["app_config.h<br/>功能开关/芯片配置"]
end
subgraph sg_Out["编译产物"]
POST["post_build/<br/>固件文件"]
end
CB --> MAKE
VS --> MAKE
MK --> BAT
BAT --> MAKE
MAKE --> TOOLCHAIN
TOOLCHAIN --> APP
TOOLCHAIN --> LIB
MAKE --> CFG
APP --> POST
LIB --> POST
POST -->|"USB 升级工具烧录"| DEV["目标板"]
架构说明:
- 三种入口殊途同归:Code::Blocks 通过解析
.cbp工程调用相同工具链;Makefile 命令行依赖make_prompt.bat预设好环境变量与make路径(Windows 下这是关键,否则make不可用);VS Code 任务则是仓库预配置的封装。 - 工具链是硬性依赖:底层
clang(pi32 交叉编译器)必须存在,否则任何入口都无法编译(典型报错clang: command not found)。 - 源码 + 预编译库:应用源码(
mbox_flash)与.a库共同链接;缺少对应.a文件会报cannot find -lxxx。 - 产物单一出口:所有编译方式的最终固件统一输出到
post_build/,随后通过 USB 升级工具或生产烧写工具写入目标板。
环境搭建
平台支持矩阵
SDK 的构建在三个平台上有不同的支持程度,官方推荐 Windows + Code::Blocks 组合:
| 系统 | 编译方式 | 说明 |
|---|---|---|
| Windows | Code::Blocks IDE | 推荐方式,开箱即用 |
| Windows | Makefile 命令行 | 需通过 sdk/make_prompt.bat 进入预配置环境 |
| Linux | Makefile 命令行 | 需要重写 download_sh.c 脚本适配 Linux 环境 |
| macOS | 自行配置 | 需自行配置交叉编译工具链 |
设计意图:Windows 是官方主推开发环境,因此仓库内置了
make_prompt.bat与utils/(make、rm 等工具集),把 GNU 工具链的路径差异封装在脚本内;Linux 用户则需要自行适配download_sh.c(该文件涉及下载/后处理流程,与 Windows 下调用方式不同)。
安装杰理编译工具链
编译的核心依赖是杰理编译工具链(内含 pi32 架构的 clang 交叉编译器)。安装步骤如下:
- 从杰理官方下载工具链:杰理工具在线文档
- Linux 用户可从此处下载:pkgman.jieliapp.com
- 下载后解压到
/opt/jieli目录 - 确保
/opt/jieli/pi32/bin/clang存在
- 下载后解压到
- 安装完成后验证:
# 验证工具链是否安装成功
clang --version
Source: README.md
注意:工具链版本必须与仓库中预编译库(
.a)匹配,混合使用不同版本的库与工具链可能导致链接错误或运行时异常。
安装烧录工具(编译完成后使用)
编译只产生固件,真正写入芯片还需要烧录工具:
| 工具 | 用途 | 获取方式 |
|---|---|---|
| USB 升级工具 | 将固件烧录到目标板 | 申请链接 · 使用文档 |
| 生产烧写工具 | 量产/裸片烧写 | 代理商处 · 使用文档 |
Source: README.md
工程结构与构建入口
仓库的构建相关文件全部位于 sdk/ 目录下,核心结构如下:
fw-AD16N/
├── sdk/ # SDK 主目录(构建工作目录)
│ ├── apps/ # 应用层代码
│ │ ├── app/ # 应用入口源码
│ │ │ ├── src/
│ │ │ │ └── mbox_flash/ # 小音箱/音频播放应用(默认工程)
│ │ │ ├── bsp/ # 板级支持包(BSP)
│ │ │ └── post_build/ # 编译后处理脚本与工具(固件输出目录)
│ │ └── include_lib/ # 头文件与预编译库
│ │ ├── cpu/ decoder/ encoder/ audio/ device/ common/ config/ ...
│ │ └── liba/ # 预编译库 (.a)
│ ├── tools/ # 编译工具与脚本
│ │ ├── make_prompt.bat # Windows 编译命令行入口
│ │ └── utils/ # 工具集(make、rm 等)
│ ├── Makefile # 顶层 Makefile(芯片 target 选择)
│ └── *.cbp # Code::Blocks 工程文件
└── README.md
Source: README.md
几个关键点:
sdk/Makefile是命令行编译的顶层入口,芯片型号通过 Makefile target 选择(make时指定或默认工程对应型号)。sdk/apps/include_lib/liba/存放预编译库,编译时链接;缺失对应.a会导致cannot find -lxxx。sdk/apps/app/post_build/是固件输出目录,Code::Blocks 编译完成后固件也生成于此。sdk/make_prompt.bat是 Windows 下 Makefile 编译的"环境开关":双击进入预配置命令行,所有环境变量与make路径已就绪。
应用工程与代码入口
当前 SDK 默认提供一个小音箱/音频播放应用工程:
| 工程文件 | 芯片 | 应用类型 | 代码入口 |
|---|---|---|---|
AD16N_mbox_flash.cbp | AD16N 全系列 | 小音箱 / 音频播放 | sdk/apps/app/src/mbox_flash/ |
Source: README.md
该应用覆盖音乐播放(FLASH/SD/U 盘,支持 MP3/WMA/WAV/.a/.b/.e 等格式)、MIDI 演奏、录音(MP2/UMP3/A)、USB Device、LINEIN、扩音等功能,是评估 SDK 编译与运行流程的起点。
编译方式详解
方式一:Code::Blocks(推荐 Windows 用户)
IDE 编译是最直观的方式,适合交互式开发调试:
- 确保已安装杰理编译工具链
- 双击
AD16N_mbox_flash.cbp工程文件打开 Code::Blocks - 点击 Build → Build(Ctrl+F9)触发编译
- 编译成功后,固件生成在
post_build/目录下
Source: README.md
Code::Blocks 通过 .cbp 工程文件内置了编译器路径、头文件搜索目录(include_lib/ 各子目录)与链接库列表,因此只要工具链安装正确即可一键编译。
方式二:Makefile 命令行
命令行编译适合脚本化、批处理与 CI 场景。所有命令都在 sdk/ 目录下执行:
# Windows 用户:先双击 sdk/make_prompt.bat 打开命令行环境
make -j4
# 显示编译详情(展开每条编译/链接命令)
make VERBOSE=1 -j4
# 清理编译中间产物
make clean
Source: README.md
Linux 用户流程(需要先适配 download_sh.c):
cd sdk
make -j`nproc`
Source: README.md
关于 make_prompt.bat 的设计意图:SDK 依赖 GNU make 与若干 Unix 工具(rm 等),这些在原生 Windows 命令行中通常不存在。make_prompt.bat 会把 sdk/tools/utils/(内置的 make、rm 等)与工具链路径加入 PATH,使 Windows 下 make 命令开箱可用——这就是"Windows 报错 make 不是有效命令时先运行该脚本"的根本原因。
方式三:VS Code
仓库已预配置 VS Code 构建任务,无需手工敲命令:
- 用 VS Code 打开仓库(或
sdk/目录) - 按
Ctrl+Shift+B打开任务列表 - 选择对应编译目标执行
Source: README.md
VS Code 任务本质上仍是调用底层 Makefile/工具链,适合习惯现代编辑器的开发者,与 Code::Blocks 共用同一套构建产物。
编译命令速查表
以下命令在 sdk/ 目录下执行:
| 目标 | 命令 | 说明 |
|---|---|---|
| 编译 | make -j4 | 并行编译(4 个任务) |
| 编译(verbose) | make VERBOSE=1 -j4 | 输出每条编译/链接命令,便于排查 |
| 清理 | make clean | 清除中间产物,重新全量编译 |
Source: README.md
编译后:烧录与升级(衔接)
编译得到固件后,进入烧录环节,完整流程为:
- 连接硬件:开发板通过 USB 或 USB 升级工具连接 PC
- 进入编程模式:按住烧录按键后复位/重新上电(或通过升级工具进入)
- 打开 USB 升级工具,选择
post_build/下的固件 - 点击下载,等待烧录完成
Source: README.md
量产场景改用杰理生产烧写工具(一拖二/一拖八),支持裸片烧写;OTA 升级支持自定义双备份固件(U 盘、SD 卡、串口等途径)。详细步骤见「烧录与升级」页面。
核心编译流程
下面的时序图展示了从克隆仓库到固件烧录的完整端到端流程,覆盖三种编译入口的公共路径:
sequenceDiagram
participant Dev as 开发者
participant Env as 编译环境<br/>(make_prompt.bat / IDE)
participant Make as 顶层 Makefile
participant Clang as 杰理工具链 clang
participant Lib as 预编译库 (.a)
participant Post as post_build/
Dev->>Env: 打开命令行 / IDE / VS Code 任务
Env->>Make: 触发构建 (make -j4 / Ctrl+F9)
Make->>Make: 解析 target,确定芯片型号与配置
Make->>Clang: 编译应用源码 (mbox_flash)
Clang->>Lib: 链接预编译库 include_lib/liba
Clang-->>Post: 输出中间目标文件
Post->>Post: 后处理脚本 (download_sh.c) 生成固件
Post-->>Dev: 固件就绪
Dev->>Dev: 使用 USB 升级工具烧录到目标板
流程要点:
- 环境准备是第一步:Windows 命令行入口必须先运行
make_prompt.bat,否则make不可用;IDE 方式则要求工具链已安装并加入路径。 - Makefile 是唯一构建核心:无论从哪个入口进来,最终都归结到
sdk/Makefile的 target 解析,因此"切换芯片型号"通过 Makefile target 完成,与入口无关。 - 编译 = 源码 + 预编译库:
mbox_flash应用源码由 clang 编译,随后与include_lib/liba/下的.a库链接;库文件缺失会在链接阶段报错。 - 后处理产出固件:
post_build/目录不仅接收链接产物,还运行后处理脚本(涉及download_sh.c,Linux 下需重写适配),最终生成可供烧录的固件文件。
完整快速开始示例
以下是从零开始编译并烧录的完整命令序列:
# 1. 克隆仓库
git clone https://gitee.com/Jieli-Tech/fw-AD16N.git
cd fw-AD16N/sdk
# 2. 编译(Windows:先双击 sdk/make_prompt.bat)
make -j4
# 3. 需要排查时,用 verbose 模式重编
make VERBOSE=1 -j4
# 4. 固件生成于 post_build/,用 USB 升级工具烧录
Source: README.md
示例:工具链验证
编译前建议先确认工具链可用:
# 验证工具链是否安装成功
clang --version
Source: README.md
若 clang --version 报错或找不到命令,说明工具链未安装或未加入 PATH(Windows 下通过 make_prompt.bat 解决,Linux 下检查 /opt/jieli/pi32/bin 是否在 PATH 中)。
示例:Linux 并行编译
# Linux 用户(需要自行修改download_sh.c文件适配Linux)
cd sdk
make -j`nproc`
Source: README.md
-j\nproc`让并行任务数自动等于 CPU 核数,最大化编译吞吐;Windows 下建议固定-j4` 或根据核数调整,避免内存占用过高。
常见编译错误与排查
编译失败是构建流程中最常见的故障场景,下表汇总官方文档给出的错误与对应解法:
| 错误提示 | 根因 | 解决方法 |
|---|---|---|
clang: command not found | 工具链未安装,或环境变量未配置 | 安装杰理编译工具链;Windows 下运行 make_prompt.bat,Linux 下检查 /opt/jieli/pi32/bin 路径 |
cannot find -lxxx | 缺少对应的 .a 库文件 | 检查 apps/include_lib/liba/ 目录,确认对应库存在 |
make: command not found | Windows 下 make 未加入 PATH | 使用 sdk/tools/make_prompt.bat 打开编译命令环境(内置 make 与 rm 等工具) |
| 链接错误 | Makefile target 与芯片型号不匹配 | 检查 Makefile target 是否匹配当前芯片型号 |
Source: README.md
边界情况与并发注意事项
- 平台差异是最大的边界:
download_sh.c后处理脚本按 Windows 环境编写,Linux 下必须重写适配,否则后处理阶段可能失败——这是官方明确提示的已知边界(见 README.md)。 - 并行编译的资源占用:
-j参数决定并行任务数。任务数过大时内存/CPU 占用飙升,可能导致编译机卡顿甚至 OOM;小内存机器建议从-j2起步。 - 工具链与库的匹配性:仓库为 Release 版本代码,需配合对应命名规则的
lib.a编译;混用不匹配的库/工具链会表现为链接错误或运行期异常。 - 清理后重建:切换芯片型号或配置后若出现"改配置不生效"的诡异问题,先执行
make clean再全量重编,避免中间产物残留。
配置开关(与编译相关的部分)
编译行为可通过两处配置调整:
- 芯片型号:通过 Makefile 选择对应 target(或修改
app_config.h中的芯片配置),用于"如何选择不同的芯片型号"(见 README.md)。 - 应用功能开关:编辑
sdk/apps/app/src/mbox_flash/app_config.h可配置目标应用的功能开关,例如内置/外置 FLASH 类型切换(见 README.md)。
完整的配置项说明(ISD_CONFIG.INI 等烧录配置)见 ISD 配置说明 与「配置说明」页面。
性能与操作建议
- 编译速度:官方建议使用
-j并行编译,如make -j4;多核机器可加大任务数显著缩短编译时间(README.md)。 - 调试辅助:编译/运行期问题可通过 UART 串口日志、空闲 GPIO 输出调试波形来定位(README.md)。
- 版本一致性:固件与烧录工具版本需匹配;升级 SDK 版本前查阅 SDK 发布版本信息 了解变更。