Zephyr应用链接第三方库

Creative Commons
本作品采用知识共享署名

本文说明如何在Zephyr中链接第三方库。

在实际的开发过程中可能出现使用有license的代码感染自己的代码, 购买的第三方库,有专门团队维护的功能库等情况。基于这些原因可能无法在Zephyr中直接使用source code,而需要直接链接使用第三方库。本文说明如何在Zephyr中链接使用第三方库。

添加方法

1.增加第三方库目录

一个Zephyr典型的目录结构如下

1
2
3
4
5
├── CMakeLists.txt
├── README.rst
├── prj.conf
└── src
└── main.c

我们增加第三方库目录externlib

1
2
3
4
5
6
7
8
9
10
11

├── CMakeLists.txt
├── README.rst
├── externlib
│   ├── inc
│   │   └── MadGt9x.h
│   └── lib
│   └── libmadgt9x.a
├── prj.conf
└── src
└── main.c

其中externlib/inc中放置第三方库的头文件,externlib/lib中放置第三方库文件

2. 修改cmake文件

修改CMakeLists.txt文件使zephyr app链接时将第三方库链接进入, 只用加入最后两句即可

1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 3.13.1)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)

target_sources(app PRIVATE src/main.c)

#将第三方库的头文件路径加入到include搜索路径
include_directories(${APPLICATION_SOURCE_DIR}/externlib/inc/)
#将第三方库加入链接,如果有更多的库可以继续用相同的方式添加
target_link_libraries(app PUBLIC ${APPLICATION_SOURCE_DIR}/externlib/lib/libmadgt9x.a)

3. 在APP中引用

最后在app代码main.c中include MadGt9x.h, 然后呼叫libmadgt9x.a内提供的API即可。再编译的时候会将libmadgt9x.a一起链接生成最终的镜像文件。

关于第三方库的编译

第三方库编译需要使用和编译Zephyr一样的工具链,另外由于是交叉编译因此需要参考编译Zephyr的编译选项,Zephyr的编译选项可以从build/build.ninja中去找FLAGS,然后根据第三方库的需求进行增减,下面是一个示例

1
2
3
4
5
6
7
8
9
10
11
12
FLAGS = -Og 
-imacros/mnt/e/westz/swiftio/src/HalSwiftIOBoard/build/zephyr/include/generated/autoconf.h
-ffreestanding -fno-common -g -mthumb -mcpu=cortex-m7
-imacros/mnt/e/westz/zephyrproject/zephyr/include/toolchain/zephyr_stdint.h
-Wall -Wformat -Wformat-security -Wno-format-zero-length -Wno-main -Wno-address-of-packed-member
-Wno-pointer-sign -Wpointer-arith -Wno-unused-but-set-variable -Werror=implicit-int
-fno-asynchronous-unwind-tables -fno-pie -fno-pic -fno-strict-overflow -fno-short-enums
-fno-reorder-functions -fno-defer-pop
-fmacro-prefix-map=/mnt/e/westz/swiftio/src/HalSwiftIOBoard=CMAKE_SOURCE_DIR
-fmacro-prefix-map=/mnt/e/westz/zephyrproject/zephyr=ZEPHYR_BASE
-fmacro-prefix-map=/mnt/e/westz/zephyrproject=WEST_TOPDIR
-ffunction-sections -fdata-sections -mabi=aapcs -std=c99

一般情况下第三方库不会依赖zephyr,所以会将-imacros-fmacro-prefix-map的编译选项删掉