此篇博客用来描述如何基于 ESP-IDF release/v3.3 添加并使用静态库。具体将分为以下几个部分:
- 静态库的生成
- 将生成的库文件放入 ESP-IDF 指定的存放位置
- 将静态库添加至 cmake 中
- 将静态库添加至 makefile 中
1. 静态库的生成
这一步说明如何生成后续要用到的静态库,以 static_lib.c
和static_lib.h
生成静态库为例。指令如下:
xtensa-esp32-elf-gcc -o static_lib.o -c static_lib.c # 将源文件生成目标文件
xtensa-esp32-elf-ar rcs libstatic_lib.a static_lib.o # 将目标文件生成静态库
2. 将生成的库文件放入 ESP-IDF 指定的存放位置
这一步需要将上一步生成的文件放入 ESP-IDF 指定的存放位置。在`COMPONENT_PATH/CMAKE_CURRENT_SOURCE_DIR`下创建文件夹和文件关系如下:
components
└── static_lib
├── CMakeLists.txt
├── component.mk
├── include
│ └── static_lib.h
└── lib
└── libstatic_lib.a
3. 将静态库添加至 cmake 中
这一步用来完善上一步创建的 CMakeLists.txt
,以便于使用 cmake 时能成功编译。CMakeLists.txt
内容如下:
set(COMPONENT_SRCS "")
set(COMPONENT_ADD_INCLUDEDIRS . include)
register_component()
target_link_libraries(${COMPONENT_TARGET} INTERFACE "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib")
target_link_libraries(${COMPONENT_TARGET} INTERFACE static_lib)
4. 将静态库添加至 makefile 中
这一步用来完善上一步创建的 component.mk
,以便于使用 make 时能成功编译。component.mk
内容如下:
COMPONENT_ADD_INCLUDEDIRS := include
LIBS := static_lib
COMPONENT_ADD_LDFLAGS := $(COMPONENT_PATH)/lib/libstatic_lib.a
COMPONENT_ADD_LINKER_DEPS := $(patsubst %,$(COMPONENT_PATH)/lib/lib%.a,$(LIBS))
5. 注意事项
在完成上述所有步骤后,如果仍然无法正常使用此静态库,以 cmake 为例,可以在应用工程下的 main
文件夹下的 `CMakeLists.txt`` 里添加对应的组件依赖,如下:
set(COMPONENT_SRCS "hello_world_main.c")
set(COMPONENT_ADD_INCLUDEDIRS "")
set(COMPONENT_REQUIRES static_lib) # 在 `main` 文件夹下的 `CMakeLists.txt` 里添加此行
register_component()