keillib格式(keil ini文件)

keil和IAR生成的hex和lib,.a库文件的区别和联系

在linux/unix, .a文件是静态链接库文件,即其只进行过编译未进行链接的

在windows,.lib文件有动态也有静态之分,静态的话与第1点描述类同,动态的话即相当于一个头文件,具体实现部分是在DLL文件中

hex文件如你的理解,是烧录进单片机中MCU的ROM或RAM中的

.lib文件的生成也如你概念的理解,就是要防止他人了解核心代码的实现,是不可以被修改的,或是强行修改后无法达到应有的功能,只可参考其头文件中各个函数被动的使用

.lib只能被使用,其甚至可以没有main函数,或许你可以写一个main函数引用.lib中相关函数使用Keil重新生成hex

keil中的库文件是什么意思

广义的说,头文件也属于库文件的一种,当然,你所指的库文件是狭义的库文件。

那个库文件,相当于头文件与C文件的一种有机集合,他是这么制作出来的,举个例子来说:

当你写了一些C文件和头文件,这些C文件能够正确的编译,并能正确的生成Hex或者Bin代码文件,那么,你可以用Keil设置不输出Hex,而是生成Lib文件,也就是库文件,那么,你生成的这个库文件与你原来的C文件和头文件的功能完全相同,所不同的是,你这个库文件是只读的,也就是说,你可以利用里面的变量,利用里面的函数,但是你无法修改。

一些官方的库文件,比如ST公司的库文件也是这样生成的。

那么,库文件有什么意义呢?一是简化开发过程,试想一下,你开发一个工程,要加载数十乃至数百个C文件和头文件,与只加载一个等效功能的库文件,哪个省事?

而其最重要的一个意义就是保密性,由于库文件是只读的,且你看不到里面的具体内容,所以,如果你想保密,不想让别人知道你某些程序具体是如何实现的,那么,就可以用库文件,这样,别人可以使用你写好的程序,但是,他们既修改不了,同时也看不到具体的实现过程。

如何在keil下制作LIB封装库文件

Project - Options for Target - Output 勾选“Create Library”就行了。可以参看文章“Keil(MDK-ARM)系列教程(三)_工程目标选项配置(Ⅰ)”:

Keil系列教程:

keil中的.lib文件是干什么用的,能打开吗

.lib本来就没有提供源程序,都是封好的库函数。就是避免被你看源码的…… 如果觉得函数有用的话,直接调用库就行了。

怎么用Keil将C程序封装成lib库?

在团队工作中,经常会有模块维护和代码封装的问题。把需要封装的代码打成一个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.

361知讯网

本文链接:http://pdidw.com/keil/23468.html

发表评论

评论列表

还没有评论,快来说点什么吧~