OpenHarmony鸿蒙硬件Hi3861-构建系统-BUILD.gn(应用模块)文件结构解释

说明

以应用程序模块中的 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")

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 等函数的实现(解决之前的“未定义引用”错误)。


原文出处:/show_1GW2DbUg4bZF.html