文章目录
- 前言
- GHS工程生成lib
- make方式生成lib
- lib的使用
- 总结
前言
在软件交付过程,如果不交付源代码,可以将源码编译之后生成lib文件提供给客户。本文介绍GHS中生成lib的两种方法,一种基于GHS工程,一种基于make文件。生成完lib后的使用,也有两种方案。本文以arm环境为例介绍,其他mcu也可参考。
GHS工程生成lib
GHS工程基于.gpj文件,该文件可以文本方式访问。
#!gbuild
defineConfig ("Debug" "DBG" "tgt\debug.gpc")
defineConfig ("Release" "REL" "tgt\release.gpc")
primaryTarget=arm_standalone.tgt
#component top_level_project
[Project]
-bsp generic
-cpu=cortexm7
-align8
:sourceDir=.
sub\Test_lib.gpj [Library]
将工程中的gpj文件中包含的编译的gpj文件(例如Test_lib.gpj)从Program改为Library
将编译文件的gpj文件改为Library,如下所示
#!gbuild
#component hello_world_c
[Library]
-object_dir=${%option_value(-object_dir)}/
{optgroup=GhsCommonOptions} -o libTest.a
-nostartfiles
-I ..头文件目录
...
配置生成的文件为libTest.a,配置好后gbuild编译即可,生成的文件除了.a文件,还会生成一个.dba文件
make方式生成lib
makefile方式即直接调用ccarm实现lib的生成。首先需要将源代码编译成对应的.o文件,本文不介绍这个过程。
$(BIN_DIR)/lib$(TARGET_C0).a: $(OBJS)
@echo -------- Generate: $@
$(LD) $(OBJS) -archive -o "$@"
这个makefile函数定义了一个目标文件$(BIN_DIR)/lib$(TARGET).a的生成规则。
首先,它依赖于$(OBJS),即所有的目标对象文件。
然后,它使用了$(LD)命令来链接这些目标对象文件,生成静态库文件$(BIN_DIR)/lib$(TARGET).a。
在链接过程中,使用生成obj文件作为输入。
最后,通过-archive选项指定生成静态库文件,-o选项指定输出文件名为$(BIN_DIR)/lib$(TARGET).a。
此处LD定义为ccarm.exe的路径。需要注意的是在生成的.a文件的前面加上了lib,这个在使用lib时非常关键(如果基于工程的使用不受影响,即使没有lib前缀也可识别)
生成的lib如下所示:
除了.a文件,还会生成一个.dba文件
lib的使用
对于生成的lib来说,有两种使用方式。
第一种是将lib作为编译的文件直接包含在gpj中
#!gbuild
#component hello_world_c
[Program]
-object_dir=${%option_value(-object_dir)}/
{optgroup=GhsCommonOptions} -o prj_lib.elf
-nostartfiles
-I ..头文件目录
...
..\..\Build\bin\libTest.a
ASW.gpj
使用该种方式,lib的名称不强制要求以lib开头,但是需要基于GHS工程实现
另外一种方式是使用编译选项,这种方式既可以基于GHS工程,也可以基于Makefile实现。
#!gbuild
#component hello_world_c
[Program]
-object_dir=${%option_value(-object_dir)}/
{optgroup=GhsCommonOptions} -o prj_lib.elf
-nostartfiles
-I ..头文件目录
...
-L..\..\Build\bin
-lTest
ASW.gpj
该方式使用-L指定lib路径,使用-l指定lib名称,此处需要注意使用的lib名称必须要以lib开头,且在使用**-l命令时不要带lib前缀**,也不带.a的文件扩展。
使用命令行也是同理,此处不再演示。
两种使用方式对于同一个lib来说,生成的map文件和s19文件没有差异
总结
生成lib的过程本质上就是将.o文件打包,其实可以通过ax命令解压出lib中的文件,可以看到lib中的.o文件。将.o文件反汇编可以得到汇编代码,但是相比于c语言来说,如果要真的反推的还是非常困难的。