使用Greenhills生成Lib并使用Lib的两种方法

news2024/9/20 8:59:25

文章目录

    • 前言
    • 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语言来说,如果要真的反推的还是非常困难的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp自定义网格布局用于选择金额、输入框焦点事件以及点击逻辑实战

样式 <view class="withdraw-section"><text class="section-title">提现金额</text><view class="amount-options"><view v-for="(item, index) in list" :key="index" class="amount-opt…

使用Leaflet进行船舶航行警告区域绘制实战

目录 前言 一、坐标格式转换 1、数据初认识 2、将区域分割成多个点 3、数据转换 4、数据转换调用 二、WebGIS展示空间位置信息 1、定义底图 2、Polygon的可视化 3、实际效果 三、总结 前言 通常而言&#xff0c;海事部门如海事局&#xff0c;通常会在所述的管辖区域内…

Java从入门到精通(十五) ~ IO流

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 什么是IO流&#xff1f; IO流的作用&#xff1a; 一、基础流 1. 字节流 1.1 字节输入流 FileInputStream 1.2 字节…

找到第一个满足条件的格值

表格第1列是科目&#xff0c;之后几列是每次的考试成绩&#xff0c;顺序排列。 ABCDE1Art03.676.27.82History3.786.217.29.83Maths5.66.36.68.9 要求根据指定的科目和成绩&#xff0c;找到该科目中大于等于该成绩的第1个格值&#xff0c;比如参数是Maths、6.5时&#xff0c;…

element-ui简单入门1.0.0

第一篇&#xff1a;table标签速用 总结&#xff1a;建楼前&#xff0c;先打地基<el-table></el-table>&#xff0c;打完地基看高度&#xff0c;一层楼4米&#xff0c;80米20个<el-table-column></el-table-column>&#xff0c;每次楼的名字是label 第…

[翻译] Asset Administration Shells

关于资产管理外壳 (AAS) 资产管理外壳 (AAS) 是工业4.0中的关键概念&#xff0c;为产品、资源&#xff08;如设备&#xff09;和过程提供信息隐藏和更高层次的抽象。AAS 是技术和设备无关的机器可读描述&#xff0c;提供访问资产属性和功能的统一接口。与现有解决方案不同&…

C# 下的限定符运算详解(全部,任意,包含)与示例

文章目录 1.限定符概述2. 全部限定符运算&#xff08;All&#xff09;3. 任意限定符运算&#xff08;Any&#xff09;4. 包含限定符运算&#xff08;Contains&#xff09;总结 当我们在C#编程中需要进行条件判断或集合操作时&#xff0c;限定符&#xff08;qualifiers&#xff…

Vue项目启动ESLint报错no-unused-vars解决办法

目录 原因分析解决方法 Vue项目启动时报错如下 ✘ http://eslint.org/docs/rules/no-unused-vars index is assigned a value but never usedsrc\views\friend\list.vue:206:17const index this.tableList.indexOf(v)^原因分析 ESLint是一个在JavaScript代码中识别和报告问…

【传知代码】辅助任务改进社交帖子多模态分类(论文复现)

在当今数字化社交时代&#xff0c;社交媒体平台如同人们生活的一部分&#xff0c;每天数以亿计的帖子在网络上涌现。这些帖子不仅仅是信息的载体&#xff0c;更是人们思想、情感和行为的折射。然而&#xff0c;要准确理解和分析这些多样化的社交帖子&#xff0c;仅依靠文本内容…

请问如何做好软件测试工作呢?

一、明确测试目标和范围 理解测试目的&#xff1a;在开始测试之前&#xff0c;首先要明确测试的目标和范围&#xff0c;确保测试计划 与需求相匹配。这有助于测试人员聚焦在关键功能上&#xff0c;避免浪费时间和资源。制定详细的测试计划&#xff1a;根据项目需求&#xff0…

【Python】爬取网易新闻今日热点列表数据并导出

1. 需求 从网易新闻的科技模块爬取今日热点的列表数据&#xff0c;其中包括标题、图片、标签、发表时间、路径、详细文本内容&#xff0c;最后导出这些列表数据到Excel中。 网易科技新闻网址&#xff1a;https://tech.163.com 2. 解决步骤 2.1 前期准备 爬虫脚本中需要引用…

Visio新手安装及超全快捷指令合集

Microsoft Visio是一款专业的流程图和图表绘制软件&#xff0c;是微软旗下的一款图表和矢量图形应用程序&#xff0c;属于Microsoft 365系列的一部分。但Visio需要单独安装&#xff0c;安装完成之后可与Word联用。 一、Visio软件介绍 Visio 是一款用途多样的绘图工具&#xff…

全球氢钎焊市场规划预测:未来六年CAGR为3.4%

随着全球制造业的持续发展和消费者对高质量产品的需求增加&#xff0c;氢钎焊作为一种高效的焊接技术&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析氢钎焊行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场趋势的演变】 1. 市场规模与增长&#…

【uniapp】集成第三方插件示例

文章目录 uniapp芯套Android壳app目录下/libs目录导入全部aar工程目录下导入rewriter文件夹 uniapp芯套Android壳 https://blog.csdn.net/xzzteach/article/details/140800350 app目录下/libs目录导入全部aar工程目录下导入rewriter文件夹 本地引入包内容 在 project 级别的…

解决com.alibaba.csp.sentinel.slots.block.flow.FlowException: null

springboot项目配置sentinel&#xff0c;能限流成功但是不能限流方法 原因 名字没对应上

token和embedding

1. token 2. embedding 1.token token&#xff1a;词元/令牌/词 tokenization&#xff1a;分词 tokenizer&#xff1a;分词器 token是最小语义单元&#xff0c;通常可以是&#xff0c;一个字母、一个词、一个数字、一个汉字或任何其他有意义的字符组合&#xff0c;取决于文本处…

免费【2024】springboot 大学生心理健康诊断专家系统设计与开发

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

R语言统计分析——点图

参考资料&#xff1a;R语言实战【第2版】 点图提供了一种在简单水平刻度上绘制大量有标签值得方法。我们可以使用dotchart()函数创建点图&#xff0c;格式为&#xff1a; dotchart(x,labels) 其中&#xff0c;x是一个数值向量&#xff0c;而labels则是由每个点的标签组成的向量…

【Linux系统编程】:进程地址空间1

1.引出进程地址空间 因为str指向的是字符串首字母的地址&#xff0c;首字母是字符常量“h”&#xff0c;地址存储在字符常量区&#xff0c;无法修改&#xff0c;故报错。 Linux进程地址空间与进程内存布局详解 - 知乎 (zhihu.com) 我们编写一段代码&#xff0c;来认识一下存储…

C++ const、constexpr与consteval作用与区别

C const、constexpr与consteval作用与区别 在C 常量表达式和编译时优化中&#xff0c;我们已经提到了常量、编译时常量与运行时常量的概念。为了加深理解&#xff0c;我们再重新明晰一下这三者的概念。 常量&#xff1a;初始化之后便不可修改的量。在c中使用const修饰的“变量”…