1. Windows开发环境
首先介绍基于Windows 剑池 CDK 开发环境下,生成和使用静态链接库(.a库)的方法。本文使用剑池 CDK 版本为2.8.7,版本不同可能会导致操作步骤有略微不同,建议使用最新剑池 CDK 版本。
1.1 Windows下生成静态链接库
准备好编译所需要的源文件和头文件,本文以test_lib为例:
打开剑池 CDK 左边的工程视图,在【Packages】上点击右键 -> 【Create a Common Package】,创建一个新的组件:
设置组件名称:
添加完成后,可以在Packages 列表下面找到test_lib组件。刚创建时,默认只有一个空的README.md文件。点击右键,添加新文件/已有文件:
右键点击test_lib -> 选择【Open Containing Folder】打开组件文件夹,编辑配置文件:package.yaml,配置编译参数。
右键工程名,点击build,开始编译。编译完成后,打开工程所在目录 -> 进入Obj目录,可以找到刚编译好的静态库:
1.2 Windows下使用静态链接库
右键该文件夹 ->【Add an Existing File】,选择刚刚生成的库libtest_lib.a,将库加入到文件夹:
在打开的组件管理窗口中,找到test_lib组件,点击【<<】,将组件从工程中移除:
点击【OK】,刷新工程,test_lib组件就会从工程下被移除。
2. Linux开发环境
2.1 Linux下生成静态链接库
下面介绍在Linux开发环境下,生成和使用静态链接库(.a库)的方法。
从工程根目录进入components目录,创建静态链接库的代码目录,并准备好源文件和头文件:
(依然以【test_lib】为例,其内包含include和src两个文件夹)
$ cd components/test_lib/
$ ls
include src
在test_lib下创建编辑配置文件:package.yaml,配置编译参数。具体可以参考components目录下其他组件的配置文件,也可以参考文档:描述文件(package.yaml)。
增加完配置文件后,当前目录结构如下:
$ ls
include package.yaml src
开始编译之前,还需要手动将test_lib加入到解决方案的编译依赖中。首先进入解决方案目录,并编辑pacakage.yaml文件:
$ cd <工程根目录>
$ cd solutions/tg6101_smart_speaker/
$ vi package.yaml
在depends字段下增加对test_lib的依赖(其中"v7.x.y"是test_lib的版本号):
depends:
- test_lib: v7.x.y
修改完成后,保存退出。
执行make开始编译:
$ make clean; make
编译完成后,在yoc_sdk/lib目录下会生成对应的静态链接库(libtest_lib.a):
$ ls yoc_sdk/lib/
...
yoc_sdk/lib/libtest_lib.a
2.2 Linux下使用静态链接库
使用静态链接库之前,首先需要删除解决方案对test_lib源代码的依赖,否则编译时会遇到重定义错误。编辑pacakage.yaml文件,移除对test_lib组件的依赖:
$ cd solutions/tg6101_smart_speaker/
$ vi package.yaml
// 编辑package.yaml文件
// 在depends字段下,删除行"- test_lib: v7.x.y"
在解决方案目录下,创建文件夹app/lib,并将生成的静态链接库拷贝到该文件夹下面:
$ mkdir -p app/lib
$ cp libtest_lib.a app/lib/
$ ls app/lib/
libtest_lib.a
编辑解决方案的配置文件package.yaml,在build_config字段下,修改libs和libpath配置:
libs:
- test_lib
libpath:
- app/lib
最后别忘了引用头文件 —— 将静态库对应的头文件(假设为test_lib.h)拷贝到app/include文件夹下面;在代码中引用该头文件:#include "test_lib.h",就可以顺利的使用静态库的函数了!
文章转载自:平头哥芯片开放社区 作者:炎赫