目标 :学会自己命名模块,创建并编译第一个自定义 Hello World 工程
前置条件:已完成 Day 1 的环境搭建(DevEco Device Tool + 工具链 + 源码导入)
一、工程结构说明
在 src/applications/sample/wifi-iot/app/ 目录下创建自定义模块,这里以 myhello 为例:
app/
├── BUILD.gn # 应用入口构建配置
└── myhello/ # 自定义模块目录(自己命名)
├── BUILD.gn # 模块构建配置
└── myhello.c # 主程序源码(自己命名)
二、文件详解
2.1 应用入口 app/BUILD.gn
gn
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"myhello:example_myhello" # 引用 myhello 模块下的 example_myhello 目标
]
}
myhello:目录名(自己命名)example_myhello:构建目标名(自己命名)
2.2 模块构建 app/myhello/BUILD.gn
gn
static_library("example_myhello") { # 构建目标名,与 BUILD.gn 中引用一致
sources = [
"myhello.c" # 源文件名(自己命名)
]
include_dirs = [
"//utils/native/lite/include", # 系统头文件路径
]
}
2.3 主程序 app/myhello/myhello.c
c
#include "ohos_init.h" // OpenHarmony 系统初始化头文件
void MyHelloMain(void) // 函数名自己命名
{
printf("My Hello World!\n"); // 自定义输出内容
}
SYS_RUN(MyHelloMain); // 注册为系统启动入口,函数名需一致
三、命名规则总结
| 位置 | 命名示例 | 说明 |
|---|---|---|
| 目录名 | myhello |
模块文件夹,小写英文 |
| 构建目标 | example_myhello |
BUILD.gn 中 static_library() 的名字 |
| 源文件名 | myhello.c |
与目录名保持一致,方便管理 |
| 函数名 | MyHelloMain |
驼峰命名,与模块名对应 |
SYS_RUN 参数 |
MyHelloMain |
必须与函数名完全一致 |
四、编译与验证
4.1 编译
- VSCode 底部工具栏点击 Build
- 或快捷键
Ctrl+Shift+B
编译成功后,镜像位于:
out/hispark_pegasus/wifiiot_hispark_pegasus/Hi3861_wifiiot_app_allinone.bin
4.2 烧录
- 连接开发板 USB
- 点击 IDE 的 Upload 按钮,等待弹出提示,按下开板RESET按键
- 等待烧录完成(约 30 秒)
4.3 查看输出
打开串口工具:
- 端口:开发板对应的 COM 口
- 波特率:115200
重启开发板,串口输出:
My Hello World!

五、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
编译报错 target not found |
BUILD.gn 中目录名或目标名写错 |
检查 app/BUILD.gn 的 features 路径是否与目录结构一致 |
编译报错 undefined reference |
函数名与 SYS_RUN 不一致 |
确认 SYS_RUN(MyHelloMain) 与函数定义一致 |
| 无串口输出 | 波特率不对 | 确认串口工具设置为 115200 |
六、练习
尝试将 myhello 改为自己的名字,例如:
- 目录:
zhangsan - 目标:
example_zhangsan - 函数:
ZhangSanMain - 输出:
"Hello from ZhangSan!"
七、下一步
Day 3 预告:学习鸿蒙内核,任务创建