IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【ESP32学习之路4——生成并使用.a静态库】 -> 正文阅读

[C++知识库]【ESP32学习之路4——生成并使用.a静态库】

一、在main中调用Hello_world

1、生成静态库

生成静态库参考上一节构建系统与组件
在项目文件夹下找到build文件夹的esp-idf文件夹,再找到要生成的静态库文件夹的名称,上一节在components/printf_hello_world新建组件,所以找到printf_hello_world文件夹下生成的.a静态库。
在这里插入图片描述
这里的libprintf_hello_world.a就是该组件生成的静态库。
每个组件 CMakeLists 文件会构建生成与组件同名的库,并最终被链接到应用程序中。

2、使用静态库

参考示例use_hello_world_lib
将build文件夹下生成的libprintf_hello_world.a复制到printf_hello_world文件夹下,删除printf_hello_world.c文件
在这里插入图片描述
在printf_hello_world组件中的cmakelists.txt文件下删除"hello_world.c"源文件,将.a静态库链接到系统中
在这里插入图片描述

set(LIBS printf_hello_world)
add_library(${LIBS} STATIC IMPORTED)
set_property(TARGET ${LIBS} PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib${LIBS}.a)
target_link_libraries(${COMPONENT_LIB} INTERFACE ${LIBS})
set_property(TARGET ${LIBS} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${COMPONENT_LIB})

set(LIBS 后面改为自己的组件名
在编译之前用idf.py fullclean 一下删除build文件夹下的配置,重新编译一遍,不然编译不通过。

也可以直接使用target_link_libraries来代替上面的链接

target_link_libraries(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/libprintf_hello_world.a")

接下来烧录进esp32开发板看到输出Hello world!即调用成功。
在这里插入图片描述

二、多个组件关系

1、多个组件生成.a静态库

参考multi_components
新建第二个组件second_component,在hello_world.c中调用second_component组件
在这里插入图片描述
调用时不仅要在hello_world.c声明second_component.h头文件,还要在printf_hello_world组件下的cmakelists.txt中包含头文件,不然编译不通过
在这里插入图片描述
以同样的方式新建第三个组件,同时在第二个组件的cmakelists.txt中包含第三个组件的头文件。
在这里插入图片描述
在这里插入图片描述
结果依次输出Hello world! second_component! third_component!
在这里插入图片描述

2、使用多个组件.a静态库

同样在multi_components项目下的build文件夹下esp_idf文件夹中找到对应的libprintf_hello_world.a libsecond_component.a libthird_component.a三个静态库以同样的方式链接,参考示例use_multi_components_lib
在这里插入图片描述
同样打印出三个组件的信息,即链接成功。

注意:如果编译不通过或链接未成功可以在顶层cmakelists.txt下设置EXTRA_COMPONENT_DIRS(用于搜索组件的其它可选目录列表。路径可以是相对于项目目录的相对路径,也可以是绝对路径)变量查找components位置处的组件。要使用 cmake 中的 set 命令 来设置这些变量,set() 命令需放在 include(…) 之前,cmake_minimum(…) 之后,如:
在这里插入图片描述

set(EXTRA_COMPONENT_DIRS    ${COMPONENTS_PATH}/printf_hello_world)

在一个大的工程下封装某个函数为.a静态库时,如果调用的其他文件的函数较多的情况下可能会出现构建失败并出现关于 “Undefined reference to …” 的链接器错误。(在.c源文件状态下能编译通过但是链接.a静态库时编译不通过出现“Undefined reference to …” )
出现原因可能是封装的这个函数在调用某个库或组件中的函数时链接不到,这时在封库的组件的cmakelists.txt下依赖REQUIRES 一下调用的组件应该就编译通过了;也有可能是循环依赖导致。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:24:29  更:2022-04-26 11:27:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:04:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码