Zephyr编译生成的build目录完全解析
引言
在Zephyr RTOS开发中,执行west build命令后会在项目目录下生成一个build目录。这个目录包含了编译过程中生成的所有中间文件、配置文件、编译产物和调试信息。理解build目录的结构和内容,对于调试、分析和优化Zephyr应用程序至关重要。
本文将深入解析Zephyr编译生成的build目录结构、重要文件的作用,以及如何利用这些信息进行开发调试。
一、build目录概述
1.1 build目录的生成
build目录由CMake和Ninja构建系统自动生成:
#mermaid-svg-zBuXrCyrCpogJZ86{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zBuXrCyrCpogJZ86 .error-icon{fill:#552222;}#mermaid-svg-zBuXrCyrCpogJZ86 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zBuXrCyrCpogJZ86 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zBuXrCyrCpogJZ86 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 .marker.cross{stroke:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zBuXrCyrCpogJZ86 p{margin:0;}#mermaid-svg-zBuXrCyrCpogJZ86 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster-label text{fill:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster-label span{color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster-label span p{background-color:transparent;}#mermaid-svg-zBuXrCyrCpogJZ86 .label text,#mermaid-svg-zBuXrCyrCpogJZ86 span{fill:#333;color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .node rect,#mermaid-svg-zBuXrCyrCpogJZ86 .node circle,#mermaid-svg-zBuXrCyrCpogJZ86 .node ellipse,#mermaid-svg-zBuXrCyrCpogJZ86 .node polygon,#mermaid-svg-zBuXrCyrCpogJZ86 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .rough-node .label text,#mermaid-svg-zBuXrCyrCpogJZ86 .node .label text,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape .label,#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zBuXrCyrCpogJZ86 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .rough-node .label,#mermaid-svg-zBuXrCyrCpogJZ86 .node .label,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape .label,#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape .label{text-align:center;}#mermaid-svg-zBuXrCyrCpogJZ86 .node.clickable{cursor:pointer;}#mermaid-svg-zBuXrCyrCpogJZ86 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 .arrowheadPath{fill:#333333;}#mermaid-svg-zBuXrCyrCpogJZ86 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zBuXrCyrCpogJZ86 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zBuXrCyrCpogJZ86 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zBuXrCyrCpogJZ86 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zBuXrCyrCpogJZ86 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zBuXrCyrCpogJZ86 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster text{fill:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 .cluster span{color:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zBuXrCyrCpogJZ86 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zBuXrCyrCpogJZ86 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape p,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zBuXrCyrCpogJZ86 .icon-shape .label rect,#mermaid-svg-zBuXrCyrCpogJZ86 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zBuXrCyrCpogJZ86 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zBuXrCyrCpogJZ86 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zBuXrCyrCpogJZ86 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} west build
CMake配置
生成构建文件
Ninja编译
生成build目录
中间文件
编译产物
调试信息
bash
# 基本编译命令
west build -b qemu_x86 samples/basic/blinky
# 指定build目录名称
west build -b qemu_x86 samples/basic/blinky -d mybuild
# 清理build目录
west build -t clean
# 完全清理
west build -t pristine
1.2 build目录位置
#mermaid-svg-CzQXqGrf1tSLxtAx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CzQXqGrf1tSLxtAx .error-icon{fill:#552222;}#mermaid-svg-CzQXqGrf1tSLxtAx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CzQXqGrf1tSLxtAx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CzQXqGrf1tSLxtAx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx .marker.cross{stroke:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CzQXqGrf1tSLxtAx p{margin:0;}#mermaid-svg-CzQXqGrf1tSLxtAx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster-label text{fill:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster-label span{color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster-label span p{background-color:transparent;}#mermaid-svg-CzQXqGrf1tSLxtAx .label text,#mermaid-svg-CzQXqGrf1tSLxtAx span{fill:#333;color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .node rect,#mermaid-svg-CzQXqGrf1tSLxtAx .node circle,#mermaid-svg-CzQXqGrf1tSLxtAx .node ellipse,#mermaid-svg-CzQXqGrf1tSLxtAx .node polygon,#mermaid-svg-CzQXqGrf1tSLxtAx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .rough-node .label text,#mermaid-svg-CzQXqGrf1tSLxtAx .node .label text,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape .label,#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape .label{text-anchor:middle;}#mermaid-svg-CzQXqGrf1tSLxtAx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .rough-node .label,#mermaid-svg-CzQXqGrf1tSLxtAx .node .label,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape .label,#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape .label{text-align:center;}#mermaid-svg-CzQXqGrf1tSLxtAx .node.clickable{cursor:pointer;}#mermaid-svg-CzQXqGrf1tSLxtAx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx .arrowheadPath{fill:#333333;}#mermaid-svg-CzQXqGrf1tSLxtAx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CzQXqGrf1tSLxtAx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CzQXqGrf1tSLxtAx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CzQXqGrf1tSLxtAx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CzQXqGrf1tSLxtAx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CzQXqGrf1tSLxtAx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster text{fill:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx .cluster span{color:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CzQXqGrf1tSLxtAx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CzQXqGrf1tSLxtAx rect.text{fill:none;stroke-width:0;}#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape p,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CzQXqGrf1tSLxtAx .icon-shape .label rect,#mermaid-svg-CzQXqGrf1tSLxtAx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CzQXqGrf1tSLxtAx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CzQXqGrf1tSLxtAx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CzQXqGrf1tSLxtAx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 项目目录
源代码
build/
默认位置
自定义位置
项目根目录/build/
-d 参数指定
| 位置类型 | 路径示例 |
|---|---|
| 默认位置 | ~/zephyrproject/zephyr/build/ |
| 自定义位置 | ~/zephyrproject/zephyr/mybuild/ |
| 应用目录 | ~/myapp/build/ |
二、build目录顶层结构
2.1 目录概览
build/
├── CMakeCache.txt # CMake配置缓存
├── CMakeFiles/ # CMake内部文件
├── cmake_install.cmake # 安装脚本
├── Makefile # 构建文件(如果使用Make)
├── build.ninja # Ninja构建文件
├── rules.ninja # Ninja构建规则
├── compile_commands.json # 编译命令数据库
├── zephyr/ # Zephyr编译产物
│ ├── CMakeFiles/
│ ├── zephyr.elf # ELF可执行文件
│ ├── zephyr.bin # 二进制文件
│ ├── zephyr.hex # HEX文件
│ ├── zephyr.map # 链接映射文件
│ ├── include/ # 生成的头文件
│ ├── Kconfig/ # Kconfig输出
│ └── modules/ # 模块编译产物
├── modules/ # 外部模块编译产物
├── boards/ # 板级编译产物
└── zephyr_modules.txt # 模块列表
2.2 目录大小分布
#mermaid-svg-mTcBPS2eGWKoGxcd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mTcBPS2eGWKoGxcd .error-icon{fill:#552222;}#mermaid-svg-mTcBPS2eGWKoGxcd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mTcBPS2eGWKoGxcd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mTcBPS2eGWKoGxcd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mTcBPS2eGWKoGxcd .marker.cross{stroke:#333333;}#mermaid-svg-mTcBPS2eGWKoGxcd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mTcBPS2eGWKoGxcd p{margin:0;}#mermaid-svg-mTcBPS2eGWKoGxcd .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-mTcBPS2eGWKoGxcd .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-mTcBPS2eGWKoGxcd .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-mTcBPS2eGWKoGxcd .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-mTcBPS2eGWKoGxcd .legend text{fill:#000000;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-mTcBPS2eGWKoGxcd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 35% 20% 20% 15% 10% build目录大小分布 zephyr.elf zephyr.bin CMakeFiles 中间文件 其他
三、核心编译产物详解
3.1 zephyr目录结构
build/zephyr/
├── zephyr.elf # ELF格式可执行文件
├── zephyr.bin # 原始二进制文件
├── zephyr.hex # Intel HEX格式文件
├── zephyr.map # 链接映射文件
├── zephyr.lst # 反汇编列表文件
├── zephyr.stat # 统计信息文件
├── zephyr.symbols # 符号表文件
├── zephyr.log # 构建日志
├── CMakeFiles/
│ ├── zephyr.dir/
│ └── ...
├── include/
│ ├── generated/
│ │ ├── autoconf.h # Kconfig生成的配置头文件
│ │ ├── devicetree.h # 设备树生成的头文件
│ │ ├── devicetree_unfixed.h
│ │ └── device_extern.h
│ └── zephyr/
│ └── ...
├── Kconfig/
│ ├── Kconfig # Kconfig配置
│ └── Kconfig.soc # SoC配置
├── modules/
│ ├── hal/
│ └── lib/
└── soc/
└── ...
3.2 ELF文件详解
zephyr.elf 是主要的编译产物,包含完整的程序信息:
bash
# 查看ELF文件信息
arm-zephyr-eabi-readelf -h build/zephyr/zephyr.elf
# 输出示例
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
Type: EXEC (Executable file)
Machine: ARM
Entry point address: 0x00000000
ELF文件内容:
| 内容 | 说明 |
|---|---|
| 代码段 | .text - 程序代码 |
| 数据段 | .data - 已初始化数据 |
| BSS段 | .bss - 未初始化数据 |
| 符号表 | .symtab - 符号信息 |
| 调试信息 | .debug_* - 调试数据 |
3.3 二进制文件详解
zephyr.bin 是可直接烧录的二进制文件:
bash
# 查看bin文件大小
ls -lh build/zephyr/zephyr.bin
# 输出示例
-rw-r--r-- 1 user user 128K Jun 14 10:00 zephyr.bin
# 查看bin文件内容
hexdump -C build/zephyr/zephyr.bin | head -20
3.4 HEX文件详解
zephyr.hex 是Intel HEX格式文件,常用于烧录工具:
bash
# 查看HEX文件内容
head -20 build/zephyr/zephyr.hex
# 输出示例
:020000040000FA
:10000000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
:10001000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
...
:00000001FF
HEX格式说明:
| 字段 | 格式 | 说明 |
|---|---|---|
| 起始码 | : |
每行开始 |
| 字节数 | 02 |
数据字节数 |
| 地址 | 0000 |
数据地址 |
| 类型 | 00 |
数据类型 |
| 数据 | XXXX... |
实际数据 |
| 校验 | FF |
校验和 |
3.5 MAP文件详解
zephyr.map 是链接映射文件,包含符号和地址信息:
bash
# 查看MAP文件
head -100 build/zephyr/zephyr.map
# 输出示例
Archive member included to satisfy reference by file (symbol)
...
Memory Configuration
Name Origin Length Attributes
FLASH 0x00000000 0x00080000 xr
SRAM 0x20000000 0x00010000 xrw
*default* 0x00000000 0xffffffff
Linker script and memory map
LOAD build/zephyr/CMakeFiles/zephyr.dir/...
...
MAP文件关键信息:
| 信息类型 | 说明 |
|---|---|
| 内存配置 | FLASH、SRAM等区域配置 |
| 符号地址 | 函数和变量的地址 |
| 段大小 | 各代码段和数据段的大小 |
| 引用关系 | 符号之间的引用关系 |
四、配置生成文件详解
4.1 autoconf.h文件
autoconf.h 由Kconfig生成,包含所有配置选项:
c
// build/zephyr/include/generated/autoconf.h
// 内核配置
#define CONFIG_KERNEL_VERSION "3.5.0"
#define CONFIG_KERNEL_MEM_POOL_SIZE 1024
// 线程配置
#define CONFIG_NUM_COOP_PRIORITIES 16
#define CONFIG_NUM_PREEMPT_PRIORITIES 32
#define CONFIG_MAIN_THREAD_PRIORITY 0
// 调试配置
#define CONFIG_DEBUG_OPTIMIZATIONS 1
#define CONFIG_DEBUG_THREAD_INFO 1
// 驱动配置
#define CONFIG_GPIO 1
#define CONFIG_SERIAL 1
#define CONFIG_UART_INTERRUPT_DRIVEN 1
// 网络配置
#define CONFIG_NETWORKING 1
#define CONFIG_NET_IPV4 1
#define CONFIG_NET_TCP 1
4.2 devicetree.h文件
devicetree.h 由设备树生成,包含设备信息:
c
// build/zephyr/include/generated/devicetree.h
// 设备节点定义
#define DT_NODELABEL__gpio0 DT_NODELABEL_from_alias_gpio0
#define DT_NODELABEL__uart0 DT_NODELABEL_from_alias_uart0
// 设备属性
#define DT_INST_0_nordic_nrf_uart_BASE_ADDRESS 0x40002000
#define DT_INST_0_nordic_nrf_uart_IRQ_0 2
#define DT_INST_0_nordic_nrf_uart_IRQ_0_PRIORITY 1
// GPIO配置
#define DT_INST_0_nordic_nrf_gpio_BASE_ADDRESS 0x50000000
#define DT_INST_0_nordic_nrf_gpio_IRQ_0 0
4.3 device_extern.h文件
device_extern.h 包含设备结构体声明:
c
// build/zephyr/include/generated/device_extern.h
// 设备结构体声明
extern const struct device __device__gpio_0;
extern const struct device __device__uart_0;
extern const struct device __device__timer_0;
// 设备区域定义
extern const struct device __device_start[];
extern const struct device __device_end[];
五、CMake相关文件详解
5.1 CMakeCache.txt
CMakeCache.txt 包含所有CMake配置变量:
cmake
# build/CMakeCache.txt
// 构建类型
CMAKE_BUILD_TYPE:STRING=Debug
// 编译器路径
CMAKE_C_COMPILER:FILEPATH=/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc
CMAKE_CXX_COMPILER:FILEPATH=/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-g++
// 目标板
BOARD:STRING=nrf52840dk_nrf52840
// Zephyr基础路径
ZEPHYR_BASE:PATH=/home/user/zephyrproject/zephyr
// 架构
CONFIG_ARCH:STRING=arm
// SoC
CONFIG_SOC:STRING=nrf52840
5.2 compile_commands.json
compile_commands.json 包含所有编译命令,用于IDE集成:
json
[
{
"directory": "/home/user/zephyrproject/zephyr/build",
"command": "/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc
-DKERNEL -I/home/user/zephyrproject/zephyr/include
-I/home/user/zephyrproject/zephyr/build/zephyr/include/generated
-mcpu=cortex-m4 -mthumb -Wall -Werror -O2 -g
-c /home/user/zephyrproject/zephyr/kernel/main.c
-o CMakeFiles/zephyr.dir/kernel/main.c.obj",
"file": "/home/user/zephyrproject/zephyr/kernel/main.c"
},
...
]
5.3 build.ninja
build.ninja 是Ninja构建系统的主构建文件:
ninja
# build/build.ninja
# 构建规则
rule C_COMPILER
command = /opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc $ARGS -c $in -o $out
description = Building C object $out
rule LINKER
command = /opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc $ARGS $in -o $out
description = Linking $out
# 构建目标
build CMakeFiles/zephyr.dir/kernel/main.c.obj: C_COMPILER ../kernel/main.c
build zephyr.elf: LINKER CMakeFiles/zephyr.dir/kernel/main.c.obj ...
六、调试信息文件详解
6.1 zephyr.lst文件
zephyr.lst 是反汇编列表文件:
bash
# 查看反汇编列表
head -100 build/zephyr/zephyr.lst
# 输出示例
build/zephyr/zephyr.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <z_main>:
0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
4: e24dd018 sub sp, sp, #24
8: e59f0034 ldr r0, [pc, #52]
c: e5900000 ldr r0, [r0]
...
6.2 zephyr.stat文件
zephyr.stat 包含统计信息:
bash
# 查看统计信息
cat build/zephyr/zephyr.stat
# 输出示例
Memory region Used Size Region Size %age Used
FLASH: 128 KB 512 KB 25.00%
SRAM: 32 KB 128 KB 25.00%
IDT_LIST: 0 GB 2 KB 0.00%
Total flash used: 128 KB
Total sram used: 32 KB
6.3 zephyr.symbols文件
zephyr.symbols 包含符号表:
bash
# 查看符号表
head -50 build/zephyr/zephyr.symbols
# 输出示例
00000000 T z_main
00000010 T z_thread_entry
00000020 T z_swap
00000030 T z_sched_lock
00000040 T z_sched_unlock
...
七、模块编译产物详解
7.1 modules目录结构
build/modules/
├── hal/
│ ├── nordic/
│ │ ├── CMakeFiles/
│ │ ├── hal_nrf.a # HAL静态库
│ │ └── ...
│ ├── stm32/
│ │ ├── CMakeFiles/
│ │ ├── hal_stm32.a
│ │ └── ...
│ └── ...
├── lib/
│ ├── mbedtls/
│ │ ├── CMakeFiles/
│ │ ├── mbedtls.a # mbedtls静态库
│ │ └── ...
│ ├── littlefs/
│ │ ├── CMakeFiles/
│ │ ├── littlefs.a
│ │ └── ...
│ └── ...
└── tee/
└── tf-m/
├── CMakeFiles/
└── tf-m.a
7.2 静态库文件
每个模块编译后生成静态库(.a文件):
bash
# 查看静态库内容
arm-zephyr-eabi-ar -t build/modules/hal/nordic/hal_nrf.a
# 输出示例
nrf_gpio.o
nrf_uart.o
nrf_spi.o
nrf_timer.o
...
# 查看静态库符号
arm-zephyr-eabi-nm build/modules/lib/mbedtls/mbedtls.a
八、构建过程与文件生成
8.1 构建流程图
#mermaid-svg-W4VaEqqNnjlCfEAn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-W4VaEqqNnjlCfEAn .error-icon{fill:#552222;}#mermaid-svg-W4VaEqqNnjlCfEAn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-W4VaEqqNnjlCfEAn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-W4VaEqqNnjlCfEAn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn .marker.cross{stroke:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-W4VaEqqNnjlCfEAn p{margin:0;}#mermaid-svg-W4VaEqqNnjlCfEAn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster-label text{fill:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster-label span{color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster-label span p{background-color:transparent;}#mermaid-svg-W4VaEqqNnjlCfEAn .label text,#mermaid-svg-W4VaEqqNnjlCfEAn span{fill:#333;color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .node rect,#mermaid-svg-W4VaEqqNnjlCfEAn .node circle,#mermaid-svg-W4VaEqqNnjlCfEAn .node ellipse,#mermaid-svg-W4VaEqqNnjlCfEAn .node polygon,#mermaid-svg-W4VaEqqNnjlCfEAn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .rough-node .label text,#mermaid-svg-W4VaEqqNnjlCfEAn .node .label text,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape .label,#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape .label{text-anchor:middle;}#mermaid-svg-W4VaEqqNnjlCfEAn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .rough-node .label,#mermaid-svg-W4VaEqqNnjlCfEAn .node .label,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape .label,#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape .label{text-align:center;}#mermaid-svg-W4VaEqqNnjlCfEAn .node.clickable{cursor:pointer;}#mermaid-svg-W4VaEqqNnjlCfEAn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn .arrowheadPath{fill:#333333;}#mermaid-svg-W4VaEqqNnjlCfEAn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-W4VaEqqNnjlCfEAn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-W4VaEqqNnjlCfEAn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W4VaEqqNnjlCfEAn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-W4VaEqqNnjlCfEAn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W4VaEqqNnjlCfEAn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster text{fill:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn .cluster span{color:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-W4VaEqqNnjlCfEAn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-W4VaEqqNnjlCfEAn rect.text{fill:none;stroke-width:0;}#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape p,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-W4VaEqqNnjlCfEAn .icon-shape .label rect,#mermaid-svg-W4VaEqqNnjlCfEAn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W4VaEqqNnjlCfEAn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-W4VaEqqNnjlCfEAn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-W4VaEqqNnjlCfEAn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} west build
CMake配置阶段
解析Kconfig
处理设备树
生成配置文件
autoconf.h
devicetree.h
CMakeCache.txt
Ninja编译阶段
编译源文件
编译模块
.o目标文件
.a静态库
链接阶段
zephyr.elf
zephyr.bin
zephyr.hex
zephyr.map
8.2 文件生成顺序
| 阶段 | 生成的文件 |
|---|---|
| CMake配置 | CMakeCache.txt, build.ninja |
| Kconfig解析 | autoconf.h, Kconfig/ |
| 设备树处理 | devicetree.h, devicetree_unfixed.h |
| 编译阶段 | .o目标文件, .a静态库 |
| 链接阶段 | zephyr.elf, zephyr.bin, zephyr.hex |
| 后处理 | zephyr.map, zephyr.lst, zephyr.stat |
九、常用调试与分析命令
9.1 查看编译产物
bash
# 查看ELF文件信息
arm-zephyr-eabi-readelf -h build/zephyr/zephyr.elf
# 查看ELF文件段
arm-zephyr-eabi-readelf -S build/zephyr/zephyr.elf
# 查看符号表
arm-zephyr-eabi-nm build/zephyr/zephyr.elf
# 查看反汇编
arm-zephyr-eabi-objdump -d build/zephyr/zephyr.elf
# 查看段大小
arm-zephyr-eabi-size build/zephyr/zephyr.elf
9.2 查看内存使用
bash
# 查看内存统计
cat build/zephyr/zephyr.stat
# 查看MAP文件中的内存配置
grep "Memory Configuration" build/zephyr/zephyr.map
# 查看段大小
arm-zephyr-eabi-size -A build/zephyr/zephyr.elf
9.3 查看配置信息
bash
# 查看Kconfig配置
cat build/zephyr/include/generated/autoconf.h
# 查看设备树配置
cat build/zephyr/include/generated/devicetree.h
# 查看CMake配置
grep "CONFIG_" build/CMakeCache.txt
9.4 查看编译命令
bash
# 查看所有编译命令
cat build/compile_commands.json
# 查看特定文件的编译命令
grep "main.c" build/compile_commands.json
十、build目录管理
10.1 清理build目录
bash
# 清理编译产物(保留配置)
west build -t clean
# 完全清理(删除整个build目录)
west build -t pristine
# 手动删除
rm -rf build/
10.2 重新配置
bash
# 重新运行CMake配置
west build -t cmake
# 更新配置后重新编译
west build -b qemu_x86 samples/basic/blinky -- -DCONFIG_DEBUG_OPTIMIZATIONS=y
# 使用menuconfig配置
west build -t menuconfig
10.3 build目录命名
bash
# 使用自定义build目录名
west build -b qemu_x86 samples/basic/blinky -d mybuild
# 多build目录管理
west build -b nrf52840dk_nrf52840 samples/basic/blinky -d build-nrf
west build -b qemu_x86 samples/basic/blinky -d build-qemu
十一、常见问题与解决方案
11.1 build目录过大
问题:build目录占用大量磁盘空间
解决:
bash
# 清理中间文件
west build -t clean
# 使用pristine清理
west build -t pristine
# 定期清理旧的build目录
rm -rf build-*
11.2 配置未生效
问题:修改Kconfig配置后未生效
解决:
bash
# 检查autoconf.h
grep "CONFIG_MY_OPTION" build/zephyr/include/generated/autoconf.h
# 重新配置
west build -t pristine
west build -b <board> <app>
11.3 设备树错误
问题:设备树配置错误导致编译失败
解决:
bash
# 检查设备树生成文件
cat build/zephyr/include/generated/devicetree.h
# 检查设备树绑定
ls build/zephyr/dts/bindings/
11.4 链接错误
问题:链接阶段出现未定义符号错误
解决:
bash
# 查看MAP文件中的符号
grep "undefined" build/zephyr/zephyr.map
# 检查静态库是否包含所需符号
arm-zephyr-eabi-nm build/modules/lib/mbedtls/mbedtls.a
11.5 编译缓存问题
问题:修改代码后编译结果未更新
解决:
bash
# 强制重新编译
west build -t pristine
west build
# 或删除特定目标文件
rm build/zephyr/CMakeFiles/zephyr.dir/kernel/main.c.obj
west build
十二、build目录与调试工具
12.1 GDB调试
bash
# 使用GDB调试ELF文件
arm-zephyr-eabi-gdb build/zephyr/zephyr.elf
# GDB命令示例
(gdb) target remote localhost:3333
(gdb) break main
(gdb) continue
(gdb) info registers
(gdb) disassemble
12.2 QEMU仿真
bash
# 使用QEMU运行
west build -t run
# 手动运行QEMU
qemu-system-arm -M nrf52840dk -kernel build/zephyr/zephyr.elf
12.3 烧录工具
bash
# 使用nrfjprog烧录(Nordic芯片)
nrfjprog --program build/zephyr/zephyr.hex --sectoranduicrerase
# 使用openocd烧录
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg \
-c "program build/zephyr/zephyr.elf verify reset exit"
十三、build目录最佳实践
13.1 build目录管理建议
#mermaid-svg-2THw1c5LonknLbF1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2THw1c5LonknLbF1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2THw1c5LonknLbF1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2THw1c5LonknLbF1 .error-icon{fill:#552222;}#mermaid-svg-2THw1c5LonknLbF1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2THw1c5LonknLbF1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2THw1c5LonknLbF1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2THw1c5LonknLbF1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2THw1c5LonknLbF1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2THw1c5LonknLbF1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2THw1c5LonknLbF1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2THw1c5LonknLbF1 .marker.cross{stroke:#333333;}#mermaid-svg-2THw1c5LonknLbF1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2THw1c5LonknLbF1 p{margin:0;}#mermaid-svg-2THw1c5LonknLbF1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster-label text{fill:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster-label span{color:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster-label span p{background-color:transparent;}#mermaid-svg-2THw1c5LonknLbF1 .label text,#mermaid-svg-2THw1c5LonknLbF1 span{fill:#333;color:#333;}#mermaid-svg-2THw1c5LonknLbF1 .node rect,#mermaid-svg-2THw1c5LonknLbF1 .node circle,#mermaid-svg-2THw1c5LonknLbF1 .node ellipse,#mermaid-svg-2THw1c5LonknLbF1 .node polygon,#mermaid-svg-2THw1c5LonknLbF1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .rough-node .label text,#mermaid-svg-2THw1c5LonknLbF1 .node .label text,#mermaid-svg-2THw1c5LonknLbF1 .image-shape .label,#mermaid-svg-2THw1c5LonknLbF1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2THw1c5LonknLbF1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .rough-node .label,#mermaid-svg-2THw1c5LonknLbF1 .node .label,#mermaid-svg-2THw1c5LonknLbF1 .image-shape .label,#mermaid-svg-2THw1c5LonknLbF1 .icon-shape .label{text-align:center;}#mermaid-svg-2THw1c5LonknLbF1 .node.clickable{cursor:pointer;}#mermaid-svg-2THw1c5LonknLbF1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2THw1c5LonknLbF1 .arrowheadPath{fill:#333333;}#mermaid-svg-2THw1c5LonknLbF1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2THw1c5LonknLbF1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2THw1c5LonknLbF1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2THw1c5LonknLbF1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2THw1c5LonknLbF1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2THw1c5LonknLbF1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2THw1c5LonknLbF1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2THw1c5LonknLbF1 .cluster text{fill:#333;}#mermaid-svg-2THw1c5LonknLbF1 .cluster span{color:#333;}#mermaid-svg-2THw1c5LonknLbF1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2THw1c5LonknLbF1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2THw1c5LonknLbF1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2THw1c5LonknLbF1 .icon-shape,#mermaid-svg-2THw1c5LonknLbF1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2THw1c5LonknLbF1 .icon-shape p,#mermaid-svg-2THw1c5LonknLbF1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2THw1c5LonknLbF1 .icon-shape .label rect,#mermaid-svg-2THw1c5LonknLbF1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2THw1c5LonknLbF1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2THw1c5LonknLbF1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2THw1c5LonknLbF1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} build目录管理
定期清理
版本控制
命名规范
使用clean/pristine
删除旧build目录
不纳入Git
记录配置
按板命名
按应用命名
13.2 实践建议
| 建议 | 说明 |
|---|---|
| 不纳入版本控制 | build目录不应提交到Git |
| 定期清理 | 使用west build -t pristine清理 |
| 命名规范 | 使用-d build-<board>命名 |
| 记录配置 | 保存prj.conf而非build目录 |
| 备份重要文件 | 备份.elf和.hex文件 |
13.3 .gitignore配置
gitignore
# .gitignore
build/
*.bin
*.elf
*.hex
*.map
*.lst
*.o
*.a
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
compile_commands.json
结束语
通过本文的深入解析,相信您已经全面理解了Zephyr编译生成的build目录:
| 目录/文件 | 内容 |
|---|---|
zephyr.elf |
ELF可执行文件(含调试信息) |
zephyr.bin |
原始二进制文件 |
zephyr.hex |
Intel HEX格式文件 |
zephyr.map |
链接映射文件 |
autoconf.h |
Kconfig配置头文件 |
devicetree.h |
设备树头文件 |
CMakeCache.txt |
CMake配置缓存 |
compile_commands.json |
编译命令数据库 |
modules/ |
模块编译产物 |
理解build目录结构对于:
- 调试分析 :使用
.elf和.map文件进行调试 - 内存优化 :分析
.stat文件优化内存使用 - 配置验证 :检查
autoconf.h确认配置生效 - 烧录部署 :使用
.hex或.bin文件烧录
建议在实际开发中充分利用build目录中的信息,提高开发效率和调试能力。
参考资料: