OpenHarmony鸿蒙硬件Hi3861-构建系统-BUILD.gn(应用模块)文件结构解释 作者:马育民 • 2025-11-13 10:35 • 阅读:10003 # 说明 以应用程序模块中的 `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 库,最终生成一个可被鸿蒙应用链接的静态库,实现环境监测、硬件控制和网络传输功能。 在实际构建流程中,鸿蒙的编译系统会根据该配置: 1. 编译 `sources` 中的所有 `.c` 文件为目标文件(`.o`); 2. 链接依赖的 `pahomqtt_static` 库; 3. 将所有目标文件打包为 `libems.a` 静态库; 4. 其他应用模块可通过 `deps = [ ":ems" ]` 引用该库,使用其提供的功能。 # 各部分详细说明 ### 1. 目标定义:`static_library("ems")` ```gn static_library("ems") { ... } ``` **解释:**`static_library` 是 GN 构建系统的目标类型,表示生成**静态库**(编译后产物为 `libems.a`)。 - `"ems"` 是目标名称,其他模块可通过 `:ems` 或路径引用该库(如 `deps = [ "path/to/ems:ems" ]`)。 ### 静态库的特点 编译时会被完整打包到最终可执行文件中,运行时无需额外加载,适合资源受限的嵌入式设备(如 Hi3861)。 ### 2. 源文件列表:`sources` ```gn 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` ```gn 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` ```gn deps = [ "//third_party/pahomqtt:pahomqtt_static", // 依赖Paho MQTT静态库 ] ``` - `deps` 用于指定当前模块**依赖的其他目标(库或模块)**,构建系统会 **先编译依赖的目标**,**再编译当前模块**,并在链接时将依赖库的代码包含进来。 - 这里依赖的 `//third_party/pahomqtt:pahomqtt_static` 是依赖 Paho MQTT 静态库(详见[链接](https://www.malaoshi.top/show_1GW2Daxoge2L.html "链接")),用于提供 `mqtt_utils.c` 中调用的 `transport_open`、`MQTTSerialize_connect` 等函数的实现(解决之前的“未定义引用”错误)。 原文出处:http://malaoshi.top/show_1GW2DbUg4bZF.html