当前位置: 首页 > news >正文

PlatformIO 在使用 GitHub 上的第三方库

PlatformIO 在使用 GitHub 上的第三方库时,每次编译都会对库的全部源码进行扫描和编译,导致编译时间变长吗?

这是 PlatformIO 使用 GitHub 库时的一个常见情况。因为:

  • GitHub 库通常是以源码形式下载的(而不是预编译的库文件)。
  • PlatformIO 默认会把这些源码当作项目的一部分,逐个编译。
  • 没有做类似预编译缓存或增量编译的优化。

解决方案和建议:

  1. 使用已发布的库版本(Registry 库)
    PlatformIO 的官方库管理(Library Registry)里一般有对应库的预编译版本,使用这些库能减少编译时间。尽量避免直接用 GitHub 源码依赖。

  2. 使用 lib_deps 指定固定版本
    platformio.ini 中指定库的特定版本(tag、commit),避免每次都拉取最新源码。

  3. 编译缓存
    PlatformIO 会对项目启用编译缓存,如果你没手动关闭缓存(build_cache),它应该不会每次都重编译所有库。你可以确认下是否开启了缓存:

    build_cache = true
    
  4. 将 GitHub 库先本地编译成静态库
    如果库支持,你可以先单独编译该库,生成 .a 静态库文件,然后在项目中引用这个库文件,避免每次编译时都重新编译库源码。

  5. 定制 lib_ignorelib_extra_dirs
    如果项目中同时存在多个库源码,利用这两个配置避免 PlatformIO 扫描不必要的源码。


有的!很多第三方库特别是专门面向 PlatformIO 或者 Arduino 生态的库,都会包含一个 library.json 文件(或者 Arduino 里的 library.properties,也类似)。

其他第三方库为什么也有类似的描述文件?

  • 规范和统一管理:这个文件让库管理器(像 PlatformIO、Arduino IDE)能自动识别库的名字、版本、依赖、支持平台等信息。
  • 方便自动化处理:平台可以用它来自动安装依赖、过滤源码、定制编译参数。
  • 生态兼容:随着 PlatformIO 生态成熟,越来越多库作者愿意提供 library.json,方便用户无痛集成。

举例:

  • PlatformIO 官方库:几乎都会有 library.json
  • Arduino 库:大多数都会有类似的 library.properties 文件,内容和 library.json 类似,Arduino IDE 和 PlatformIO 都能识别。
  • GitHub 上的热门开源库:如果库作者想兼容 PlatformIO,通常会加一个 library.json

如果第三方库没有 library.json怎么办?

  • PlatformIO 依然可以使用,但需要你手动配置依赖和编译选项。
  • 你也可以自己创建一个简单的 library.json 放进库根目录,让 PlatformIO 识别。
  • 或者通过 platformio.ini 配置来告诉 PlatformIO 如何使用该库。

总结:

绝大多数活跃维护且支持 PlatformIO 的第三方库都会有 library.json 或类似的描述文件,方便自动化管理和集成。


PlatformIO 的底层构建系统是基于 SCons 的。


详细解释:

  • SCons 是一个用 Python 写的开源构建工具,类似于 Make 或 Ninja,但它用 Python 脚本做配置,比传统的 Makefile 更灵活。
  • PlatformIO 使用 SCons 作为构建引擎,来实现对源码的编译、链接、库管理等工作。
  • PlatformIO 在此基础上封装了一套更高层的项目配置和库管理机制,用户主要通过 platformio.ini 来配置,SCons 脚本在背后解析并执行。

为什么用 SCons?

  • 跨平台:支持 Windows、Linux、macOS。
  • 灵活强大:可以用 Python 写复杂的构建逻辑。
  • 集成简单:PlatformIO 方便自定义和扩展。
  • 支持多种工具链和框架:适合各种嵌入式开发环境。

你可以看到的体现:

  • PlatformIO 项目里会有 .pio 目录,里面有 SCons 生成的临时文件和缓存。
  • 编译时 PlatformIO 会调用 SCons 脚本去做编译、链接等任务。
  • 自定义构建步骤时,也可以通过 extra_scripts 等方式插入 SCons 脚本片段。

PlatformIO 利用 SCons 进行库管理和构建的核心原理和示例。


1. PlatformIO 构建系统架构简述

  • PlatformIO 底层用 SCons 作为构建引擎。
  • 它用 Python 脚本封装了一套自动化流程:扫描源码、管理依赖库、调用编译器、链接生成固件。
  • 项目配置由 platformio.ini 控制,SCons 通过读取这个配置执行对应的动作。

2. 核心构建流程(简化版)

Import("env")# 1. 添加库搜索路径
env.Append(LIBPATH=[".pio/libdeps/your_env"])# 2. 加载第三方库源码
libs = env.ScanLibs()# 3. 添加库到构建环境
for lib in libs:env.Append(LIBS=[lib])# 4. 编译源码文件
objs = env.Object("src/main.cpp")# 5. 链接生成固件
env.Program(target="firmware", source=objs)

:以上是简化示意,PlatformIO 内部有更复杂的流程管理库依赖和增量编译。


3. 库管理相关的 SCons API

  • env.ScanLibs()
    自动扫描并收集项目和依赖库的源码文件。

  • env.Append(LIBPATH=[...])
    添加库文件搜索路径。

  • env.Library() / env.StaticLibrary()
    将源码编译成静态库。

  • env.Program()
    最终生成可执行文件(固件)。


4. PlatformIO 中的库管理目录

  • .pio/libdeps/<环境名>/
    存放每个环境下的依赖库源码。

  • .pio/build/<环境名>/
    构建过程产生的对象文件、库文件、固件。


5. 自定义构建步骤

PlatformIO 支持通过 extra_scripts 加载自定义 SCons 脚本,比如:

[env:myenv]
extra_scripts = extra_build.py

extra_build.py 中可以操作 env 来插入自定义编译规则、拷贝文件等:

Import("env")def before_build(source, target, env):print("自定义构建前执行任务")env.AddPreAction("buildprog", before_build)

6. 官方源码参考

  • PlatformIO 源码里 platformio/builder/main.py 负责构建逻辑,会调用 SCons API 来完成任务。
  • 你可以在PlatformIO GitHub仓库中查看。

7. 进一步学习建议

  • 学习 SCons 官方文档:https://scons.org/doc.html
  • 阅读 PlatformIO 构建源码,结合 platformio.ini 试验构建脚本
  • 使用 pio run -v 观察详细编译过程,理解调用的 SCons 命令

http://www.dtcms.com/a/265628.html

相关文章:

  • Spark 4.0的VariantType 类型以及内部存储
  • 云上堡垒:如何用AWS原生服务构筑坚不可摧的主机安全体系
  • java教程——初识guava(2)
  • 在 React 中使用 WebSockets 构建实时聊天应用程序
  • 实训项目记录 | 7.3
  • AI会取代网络工程师吗?理解AI在网络安全中的角色
  • 【网络安全】Webshell命令执行失败解决思路
  • 如何避免服务器出现故障情况?
  • 数据库服务端有连接数限制吗
  • vue3 + cesium + heatmapjs 开发热力图(不需要CesiumHeatMap插件)
  • JA3指纹在Web服务器或WAF中集成方案
  • 在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
  • Element UI 完整使用实战示例
  • Flutter 进阶:实现带圆角的 CircularProgressIndicator
  • 解决安装SunloginClient问题记录(Ubuntu 24.04.2)
  • 删除docker镜像后如何正确清理残余
  • 前端的一些报错
  • AIX 环境磁盘空间管理指南
  • 从零开始构建Airbyte数据管道:PostgreSQL到BigQuery实战指南
  • CentOS系统高效部署fastGPT全攻略
  • 两级缓存 Caffeine + Redis 架构:原理、实现与实践
  • 跨云架构:性能、成本与合规的平衡艺术
  • Linux 73 LAMP4
  • 渗透测试中 phpinfo() 的信息利用分析
  • Java接口报错:Packet for query is too large - 解决方案与架构思考
  • 从0到1搭建同城O2O外卖平台:外卖系统源码架构解析与实战指南
  • 前置代理重构网络访问的「中转站」
  • YOLOv2 正负样本分配机制详解
  • ollama bge-m3 Embending模型永久加载 does not support generate
  • Spring注解之@Repository