Keil的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。

 

<think>好的,用户想了解如何在Keil环境中创建和使用C语言的文件(.lib)。首先,我需要整理一下步骤,确保逻辑清晰,并且符合用户的需求。 首先,创建C语言的步骤。用户需要编写源代码,这里要确认函数声明的正确性,比如使用头文件来声明导出函数,而源文件实现这些函数。然后,编译生成目标文件,这一步可能需要根据Keil的编译器调整编译选项,比如使用--library_module来生成适用的目标文件。接下来,使用管理工具(如KeilLIB51或LIBARM)将目标文件打包成.lib文件,这里要注意不同架构可能需要不同的工具,比如ARM和C51有不同的命令。 然后是使用的部分。用户需要在Keil项目中添加头文件路径,这样编译器能找到函数声明。接着,将.lib文件添加到项目里,这一步可能通过IDE的配置完成。最后,在代码中引用头文件并调用库函数,编译整个项目时链接器会自动处理的链接。 接下来,注意事项。代码优化方面,通常需要优化大小或速度,但要注意调试时的设置。符号冲突可能发生,所以中的函数命名最好有唯一性。跨平台兼容性也是要考虑的,特别是硬件相关的代码可能需要条件编译。 用户提供的引用中有提到USB驱动和LVGL组件的添加,这可能涉及到的实际应用案例,可以举例说明如何将集成到项目中。比如引用[2]中的C# DLL可能和C不同,但思路类似,而引用[3]中的LVGL组件添加说明文件需要正确包含到工程中,这和Keil中添加.lib的步骤相似。 生成相关问题部分,需要涵盖的创建步骤、调试方法、静态与动态的区别、Keil中的优化设置,以及如何确保跨平台兼容性。这些问题可以帮助用户更深入地理解的使用和可能出现的问题。 需要确保所有步骤详细且准确,特别是Keil特定的工具和命令,比如LIBARM和LIB51的区别,以及编译选项的设置。另外,示例代码部分要简单明了,展示头文件和源文件的结构,以及的使用方法。可能还需要提醒用户注意编译器兼容性,比如ARMCC和GCC生成的目标文件是否兼容,避免用户混淆。 最后,检查是否符合用户的要求,特别是关于封装和在Keil中使用,避免遗漏关键步骤。同时,确保语言简洁,用中文回答,不使用Markdown格式,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,主要关注代码和步骤。</think>在Keil环境中创建和使用C语言文件(.lib)的步骤如下: ### 一、创建静态步骤 1. **编写源代码** - 头文件声明导出函数: ```c // mylib.h #ifndef MYLIB_H #define MYLIB_H int add(int a, int b); #endif ``` - 源文件实现函数: ```c // mylib.c #include "mylib.h" int add(int a, int b) { return a + b; } ``` 2. **编译为目标文件** - 在Keil工程中: 1. 新建`Library`类型工程 2. 勾选`Create Library`选项[^3] 3. 使用`--library_module`编译选项生成`.obj`文件 3. **生成文件** - ARM架构:使用`LIBARM`工具 ```bash LIBARM mylib.lib mylib.obj ``` - 8051架构:使用`LIB51`工具 ```bash LIB51 CREATE mylib.lib OBJECT (mylib.obj) ``` ### 二、使用静态步骤 1. **添加头文件路径** 在Keil项目配置中设置`Include Paths`指向头文件目录 2. **链接文件** 将`.lib`文件拖拽到项目的`Target`目录或通过`Options for Target > Library`配置 3. **调用库函数** ```c #include "mylib.h" int main() { int result = add(3,5); // 输出8 return 0; } ``` ### 三、关键注意事项 1. **符号可见性**:使用`__declspec(dllexport)`显式声明导出函数(仅限动态) 2. **调试支持**:编译时保留调试信息需添加`--debug`标志 3. **跨平台兼容**:使用`#pragma pack`控制结构体对齐方式[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值