前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【嵌入式】制作 `.lib` 时需要 `.c` 和对应的 `.h` 文件吗?

【嵌入式】制作 `.lib` 时需要 `.c` 和对应的 `.h` 文件吗?

作者头像
LuckiBit
发布2025-03-12 09:28:57
发布2025-03-12 09:28:57
3000
代码可运行
举报
文章被收录于专栏:C语言C语言
运行总次数:0
代码可运行
1. 制作 .lib 时需要 .c 和对应的 .h 文件吗?
答案:需要
  • .c 文件
    • 是必须的,因为 .lib 文件是由 .c 文件编译生成的,包含函数的具体实现。
    • 示例:circular_buffer.c 提供 init_circular_buffer 等函数的实现。
  • .h 文件
    • 不是严格必须,但强烈推荐使用。
    • 原因
      • .h 文件声明了函数原型和结构体(如 CircularBuffer),供 .c 文件使用。
      • 如果 .c 文件中直接定义所有内容(不引用 .h),可以不提供 .h,但这会导致代码维护困难。
    • 典型做法
      • .h 文件定义接口,.c 文件包含 #include "xxx.h" 并实现功能。
制作流程

项目结构

代码语言:javascript
代码运行次数:0
复制
C:\Projects\library\
    ├── circular_buffer.c
    ├── circular_buffer.h
    ├── circular_buffer.uvproj

代码示例

circular_buffer.h

代码语言:javascript
代码运行次数:0
复制
#ifndef CIRCULAR_BUFFER_H
#define CIRCULAR_BUFFER_H
typedef struct {
    unsigned int* buffer;
    unsigned long int sum;
    unsigned char index;
    unsigned char count;
    unsigned char size;
} CircularBuffer;
void init_circular_buffer(CircularBuffer* cb, unsigned int* storage, unsigned char size);
#endif

circular_buffer.c

代码语言:javascript
代码运行次数:0
复制
#include "circular_buffer.h"
void init_circular_buffer(CircularBuffer* cb, unsigned int* storage, unsigned char size) {
    cb->buffer = storage;
    cb->sum = 0;
    cb->index = 0;
    cb->count = 0;
    cb->size = size;
}

生成 .lib

  • 在 Keil C51 中:
    1. 新建项目 circular_buffer.uvproj
    2. 添加 circular_buffer.cSource Group 1
    3. Options for Target -> Output -> 勾选 Create Library,输出 circular_buffer.LIB
    4. C51 -> Include Paths 添加 .h 文件路径。
    5. 编译,生成 circular_buffer.LIB
结论
  • 需要 .c:提供实现。
  • 推荐 .h:提供声明,保持代码规范。若 .c 中自包含声明,则 .h 可省略,但不建议。

2. 使用 .lib 时需要 .lib.h 文件吗?

答案:需要
  • .lib 文件
    • 是必须的,包含函数实现的目标代码,用户项目通过链接器(LX51)解析符号。
  • .h 文件
    • 是必须的(除非用户手动声明所有接口)。
    • 原因
      • 用户代码(如 adc.c)需要知道函数原型和结构体定义(如 CircularBuffer),这些通常在 .h 文件中。
      • 不提供 .h,用户无法调用 .lib 中的函数,除非自己重写声明(不现实)。
使用流程

项目结构

代码语言:javascript
代码运行次数:0
复制
C:\UserProject\
    ├── adc.c
    ├── circular_buffer.LIB
    ├── circular_buffer.h
    ├── user.uvproj

用户代码

adc.c

代码语言:javascript
代码运行次数:0
复制
#include "circular_buffer.h"
CircularBuffer cb;
unsigned int storage[10];
void main(void) {
    init_circular_buffer(&cb, storage, 10);
    while (1);
}

配置

  • 在 Keil C51 中:
    1. 新建项目 user.uvproj
    2. 添加 adc.ccircular_buffer.LIBSource Group 1
    3. C51 -> Include Paths 添加 .h 文件路径。
    4. Output -> Create Executable,编译生成 user.hex
结论
  • 需要 .lib:提供实现。
  • 需要 .h:提供接口声明。

3. 这样会不会重复?

问题解析

你担心的是 .c.h 在制作 .lib 时使用,之后使用 .lib.h 会不会导致重复定义或冗余。

答案:不会重复
  • 制作 .lib 阶段
    • .c 文件编译为目标代码,生成 .lib,其中只包含机器码和符号表,不保留源代码。
    • .h 文件仅用于声明,编译时被 .c 引用,不直接嵌入 .lib
  • 使用 .lib 阶段
    • .lib 提供实现(已编译的二进制代码)。
    • .h 提供声明,用户代码通过 #include 使用这些声明调用 .lib 中的实现。
    • 链接器(LX51)
      • 将用户代码(adc.obj)与 .lib 链接,解析符号(如 _init_circular_buffer),不会重复定义。
为什么没有重复
  • .c.lib
    • .c 是源代码,.lib 是编译结果,用户只收到 .lib,无需 .c,不存在重复。
  • .h 的作用
    • .h 只声明接口,不包含实现,多次 #include 被预处理器保护(如 #ifndef)避免重复定义。
  • 符号唯一性
    • 链接器确保每个符号(如 _init_circular_buffer)只定义一次,若 .lib 和用户代码重复定义同一符号,会报错(如 L121: SYMBOL DEFINED MORE THAN ONCE),但正常流程不会发生。
可能误解的“重复”
  • 若用户同时包含 circular_buffer.ccircular_buffer.LIB,会导致重复定义错误(L121)。
  • 正确做法
    • 开发者只提供 circular_buffer.LIBcircular_buffer.h,不给用户 .c 文件。

4. 完整示例

开发者
  • 文件
    • circular_buffer.h(如上)。
    • circular_buffer.c(如上)。
  • 生成
    • 编译生成 circular_buffer.LIB
  • 交付
    • circular_buffer.LIB
    • circular_buffer.h
用户
  • 文件
    • adc.c(调用函数)。
    • circular_buffer.LIB(实现)。
    • circular_buffer.h(声明)。
  • 使用
    • 配置项目,添加 .lib.c,编译运行。

5. 总结

  • 制作 .lib
    • 需要 .c(实现)和 .h(声明,推荐)。
  • 使用 .lib
    • 需要 .lib(实现)和 .h(声明)。
  • 重复问题
    • 不会重复,.lib.c 的编译结果,.h 只提供接口,链接器确保符号唯一。

若想用汇编调用,.h 可转为汇编声明(如 EXTRN CODE),但仍需 .lib

6. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言 void 关键字区别有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持点我关注❤️
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 答案:需要
  • 制作流程
  • 结论
  • 2. 使用 .lib 时需要 .lib 和 .h 文件吗?
    • 答案:需要
    • 使用流程
    • 结论
  • 3. 这样会不会重复?
    • 问题解析
    • 答案:不会重复
    • 为什么没有重复
    • 可能误解的“重复”
  • 4. 完整示例
    • 开发者
    • 用户
  • 5. 总结
  • 6. 结束语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档