说明
以应用程序模块中的 BUILD.gn 为例,解释文件各部分作用,BUILD.gn 文件内容如下:
static_library("ems") {
sources = [
"main.c",
"enrionment_task.c",
"aht20.c",
"beeper_task.c",
"oled_ssd1306.c",
"oled_task.c",
"publish_task.c",
"wifi_utils.c",
"mqtt_utils.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include",
"//foundation/communication/interfaces/kits/wifi_lite/wifiservice",
"//third_party/pahomqtt/MQTTPacket/src",
"//third_party/pahomqtt/MQTTPacket/samples",
"//vendor\hisi\hi3861\hi3861\components\at\src",
"//third_party/pahomqtt/MQTTClient-C/src",
"//third_party/pahomqtt/MQTTClient-C/src/liteOS",
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/",
]
#表示需要a_myparty 软件包
deps = [
"//third_party/pahomqtt:pahomqtt_static",
]
}
整体作用
该配置文件的作用是 将“ems”模块的所有源文件编译为静态库,并通过 include_dirs 确保编译时能找到所需头文件,通过 deps 关联依赖的 MQTT 库,最终生成一个可被鸿蒙应用链接的静态库,实现环境监测、硬件控制和网络传输功能。
在实际构建流程中,鸿蒙的编译系统会根据该配置:
- 编译
sources中的所有.c文件为目标文件(.o); - 链接依赖的
pahomqtt_static库; - 将所有目标文件打包为
libems.a静态库; - 其他应用模块可通过
deps = [ ":ems" ]引用该库,使用其提供的功能。
各部分详细说明
1. 目标定义:static_library("ems")
static_library("ems") { ... }
解释:static_library 是 GN 构建系统的目标类型,表示生成静态库(编译后产物为 libems.a)。
"ems"是目标名称,其他模块可通过:ems或路径引用该库(如deps = [ "path/to/ems:ems" ])。
静态库的特点
编译时会被完整打包到最终可执行文件中,运行时无需额外加载,适合资源受限的嵌入式设备(如 Hi3861)。
2. 源文件列表:sources
sources = [
"main.c", // 程序入口或主逻辑
"enrionment_task.c", // 环境监测任务(可能是传感器数据采集)
"aht20.c", // AHT20温湿度传感器驱动
"beeper_task.c", // 蜂鸣器控制任务
"oled_ssd1306.c", // SSD1306型号OLED屏幕驱动
"oled_task.c", // OLED显示任务(负责刷新显示内容)
"publish_task.c", // MQTT发布任务(上传数据到服务器)
"wifi_utils.c", // WiFi连接工具函数(如配网、获取IP)
"mqtt_utils.c", // MQTT客户端工具函数(连接、订阅、发布)
]
解释:sources 用于指定当前模块需要编译的所有源文件(.c),这些文件会被编译器编译为目标文件(.o),最终打包到静态库 libems.a 中。
3. 头文件路径:include_dirs
include_dirs = [
"//utils/native/lite/include", // 鸿蒙基础工具函数头文件
"//kernel/liteos_m/components/cmsis/2.0", // LiteOS-M内核的CMSIS接口(嵌入式标准)
"//base/iot_hardware/interfaces/kits/wifiiot_lite", // 鸿蒙IoT硬件接口(如GPIO、I2C驱动)
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include", // Hi3861的LwIP网络库头文件
"//foundation/communication/interfaces/kits/wifi_lite/wifiservice", // 鸿蒙WiFi服务接口
"//third_party/pahomqtt/MQTTPacket/src", // Paho MQTT协议报文解析头文件
"//third_party/pahomqtt/MQTTPacket/samples", // MQTT传输层(transport.c)头文件
"//vendor/hisi/hi3861/hi3861/components/at/src", // Hi3861的AT指令组件头文件
"//third_party/pahomqtt/MQTTClient-C/src", // Paho MQTT客户端核心头文件
"//third_party/pahomqtt/MQTTClient-C/src/liteOS", // MQTT适配LiteOS的头文件
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/", // 重复的LwIP头文件路径(冗余,不影响)
]
解释:include_dirs 用于指定 头文件(.h)的搜索路径,编译器会从这些路径中查找 #include 引用的头文件(如 #include "wifi_utils.h"、#include "MQTTClient.h")。
- 路径以
//开头,表示鸿蒙工程的 根目录,确保在不同环境下路径引用一致。 - 包含的路径覆盖了:鸿蒙系统接口、内核接口、硬件驱动接口、网络库(LwIP)、MQTT库等,与
sources中的源文件功能对应(如mqtt_utils.c需要引用 Paho MQTT 的头文件)。
4. 依赖库:deps
deps = [
"//third_party/pahomqtt:pahomqtt_static", // 依赖Paho MQTT静态库
]
deps用于指定当前模块依赖的其他目标(库或模块),构建系统会 先编译依赖的目标,再编译当前模块,并在链接时将依赖库的代码包含进来。这里依赖的
//third_party/pahomqtt:pahomqtt_static是依赖 Paho MQTT 静态库(详见链接),用于提供mqtt_utils.c中调用的transport_open、MQTTSerialize_connect等函数的实现(解决之前的“未定义引用”错误)。