keil如何把程序打包成函数

keil如何把程序打包成函数,第1张

Keil可以使用编译器和链接器来把程序打包成函升升并数。在编译程序时,需要指定编译选项“吵迹-fPIC”,以便编译器生成可重定位的目标代码。然后,可以使用链接器将目标代码组装成函数。最后,可以使笑派用函数库管理器将函数打包成函数库,以便在其他程序中使用。

在团队工作中,经常会有模块维护和代码封装的问题。把需要封装的代码薯斗打成一个lib无疑是一种很好的方式。

1.创建lib

创建一个lib很容易,只需要创建一个target,然后把需要封装的代码全部加进来,然后再Options of Target中选择Create Library,然后编译,因为是lib所以不需要链接,编译过了,你的lib就创建了。当然了,为了别人可以轻松的使用,请提供头文件支持哦。

2.使用lib

使用lib就更容易了,把lib和头文件加入你的工程,直接调用就是了。lib库会和你工程中其它编译后的obj一起链接,形成最后的目标文件。

3.注意事项

首先,Startup和中断处理程序不要封入LIB,这些程序会在链接的时候产生问题。具体的原因么,有点复杂,应该是中断程序的link机制有所不同的关系吧。

其次,Lib的文件要分的细一点,没有调用关系的两个函数不要放到同一个C文件中,因为LIB51在链接的时候是按模块来链接的,一个模块就对应一个C文件,假如链接器因为要使用你一个函数fA而引入了A模块,那么A模块中的另外的函数也会被引入,而另外的函数你又没有使用的话,那么就会引发Keil经典的UNCALLED FUNC的warning。这个warning在Keil的文档中说的好清楚了,我粘过来吧:

It is common practice during the development process to write but not call

additional functions. While the compiler permits this without error, the

Linker/Locator does not treat this code casually because of the support for data

overlaying, and emits a warning message.

Interrupt functions are never called, they are invoked by the hardware. An

uncalled routine is treated as a potential interrupt routine by the linker. This

means that the function is assigned non-overlayable data space for its local

variables. This quickly exhausts all available data memory (depending upon the

memory model used).

If you unexpectedly run out of memory, be sure to check for linker warnings

relating to uncalled or unused routines. You can use the linker’s IXREF

directive to include a cross reference list in the linker map (.M51) file.

大意就是说,Keil的内存应用模式是指定地址的,也就是要根据调用关系来决定哪块地址可以被复用。对于这种没人调用的函数,Keil会认为是中断处理程序,并不能决定调用关系,所以此类uncalled函数的空间不能和其他的程序共享,也就是说,这函数用多少RAM,你就少多少RAM。那uncall多了会怎么样?----废话,弯手裤当然是内存溢出了。

所以,lib的功能可以做的大而全,但是里面的模块一定要分的要多细,有多细,只有这样,你才能像在windows上用CRT一样舒服的使用LIB。

个人总结

1. 生成lib 的工程可以没有main函数,可以只有一个.c文件,一个.c文件中可以只有一个函数

2. 需要在lib工程中建立埋简一个.h文件, 必须用extern声明各全局变量和函数.

3. 调用lib文件的工程中必须包括lib中的.h文件, 也就是lib工程和调用工程都包含同一个.h文件(好像有点废话)

4.Lib的文件要分的细一点,没有调用关系的两个函数不要放到同一个C文件中. 没有调用关系的最好是一个函数单独放在一个.c文件中.这是为了避免在keil中应用程序调用lib库里出现告警. 因为LIB51在链接的时候是按模块来链接的,一个模块就对应一个C文件,假如链接器因为要使用你一个函数fA而引入了A模块,那么A模块中的另外的函数也会被引入,而另外的函数你又没有使用的话,那么就会引发Keil经典的UNCALLED FUNC的warning。

通常为每一个函数编一个.C文件,而整个lib用一个.h文件,这样就可以使只有被调用的函数参与连接

5.调用lib库时需要在工程中将.lib文件加进来. 在Group中右键,然后Add ,注意文件类型中选择*.lib.

点击全局编译按钮

,完成后在相应目录文件夹(之前存放hex文件的路径)下即可看到生知锋成的ethernet.lib文件。

6、lib文件生成后,还需.h文件,h文件有两种方式,一种是保留之前.c文件对应的.h文件,继续照常使用,另一种是可将单独的.h文件合并成一个新的ethernet.h,直接在main.c调用ethernet.h即可。

7、将lib文件剪切放到Ethernet文件路径下,将之前的socket.c、w5500.c等文件删除掉,头文件换成ethernet.h,工程里将ethernet.lib加入到group(ethernet文件夹)里。

8、将取消编译的文件重新打开,将编译后文件类型改回.hex文件,然后全编译,没有错误即完成。

另外,若想将一个.c文件生成一个lib文件,只需保留该.c文件进行编译,.h文件也保持不变,将工程中原先的.c文件替换成.lib文件即可。

用心写好每篇文章,简猛缺分享给需要的你☺,如果对您有用希望能留下您的脚印(点赞/评论/收藏)!

stm32

c语言

keil mdk

嵌入式

注意!注意!你有一个手机待领取

巨摩互动

广告

Keil对lib封装库反汇编成C语言.pdf

502下载·22评论

2013年5月6日

把c++的exe工程编译为动态库dll静态库lib,并实现调用(超详细)

2087阅读·0评论·1点赞

2020年8月28日

源代码封装成库Lib的方法

504阅读·0评论·0点赞

2022年10月14日

STM32/keil把多个c文件编译为静态库lib

2190阅读·0评论·6点赞

2021年1月5日

C/C++ 静态库(lib)的概念和使用方法

3432阅读·0评论·4点赞

2022年5月2日

Keil 下生成LIB库文件以及如何使用LIB库文件

732阅读·1评论·0点赞

2020年12月19日

注意!注意!你有一个手机待领取

巨摩互动

广告

C语言 之 编译自己的lib库

1457阅读·0评论·1点赞

2020年8月7日

CMake交叉编译简单教程

3.2W阅读·2评论·14点赞

2018年9月7日

如何将c语言封装成dll文件,封装动态库dll与静态库lib(原理及简单实例)

2069阅读·0评论·1点赞

2021年5月21日

keil C对lib封装库反汇编成C语言,Keil软件“C语言”及“汇编”混编 —— 相关拦辩知识整理.doc...

1587阅读·0评论·0点赞

2021年5月21日

keil 加密:编译代码成lib库

454阅读·0评论·0点赞

2022年7月28日

Keil C 里面Lib库文件的生成与调用

11下载·0评论

2020年8月4日

keil C对lib封装库反汇编成C语言

101下载·4评论

2011年4月8日

C语言编译lib库手动添加

1888阅读·0评论·0点赞

2017年6月18日

基于Keil下多文件打包生成Lib库文件的具体 *** 作

2667阅读·3评论·2点赞

2020年1月18日

Windows DOS命令行编译C/C++程序----库文件.lib的链接

1752阅读·0评论·0点赞

2019年2月21日

keil把源代码生成lib的方法

2754阅读·0评论·6点赞

2022年1月25日

keil 编译生成 .lib文件

2244阅读·4评论·1点赞

2018年1月8日

keil多文件编译

724阅读·0评论·1点赞

2022年4月3日

在keil中将文件封装为lib库文件需要注意的地方

1395阅读·0评论·0点赞

2021年11月15日

去首页

看看更多热门内容

评论1

YJer

你好,第6点中提到的,将单独的.h文件合并成一个新的ethernet.h,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8224019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存