欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【嵌入式】制作 `.lib` 时需要 `.c` 和对应的 `.h` 文件吗?

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

2025/3/12 6:43:38 来源:https://blog.csdn.net/EleganceJiaBao/article/details/146170527  浏览:    关键词:【嵌入式】制作 `.lib` 时需要 `.c` 和对应的 `.h` 文件吗?

LuckiBit

目录

    • **1. 制作 `.lib` 时需要 `.c` 和对应的 `.h` 文件吗?**
      • **答案:需要**
      • **制作流程**
      • **结论**
    • **2. 使用 `.lib` 时需要 `.lib` 和 `.h` 文件吗?**
      • **答案:需要**
      • **使用流程**
      • **结论**
    • **3. 这样会不会重复?**
      • **问题解析**
      • **答案:不会重复**
      • **为什么没有重复**
      • **可能误解的“重复”**
    • **4. 完整示例**
      • **开发者**
      • **用户**
    • **5. 总结**
    • 6. 结束语
    • 相关文章:

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" 并实现功能。

制作流程

  1. 项目结构
    C:\Projects\library\├── circular_buffer.c├── circular_buffer.h├── circular_buffer.uvproj
    
  2. 代码示例
    • circular_buffer.h
      #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
      #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;
      }
      
  3. 生成 .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 中的函数,除非自己重写声明(不现实)。

使用流程

  1. 项目结构
    C:\UserProject\├── adc.c├── circular_buffer.LIB├── circular_buffer.h├── user.uvproj
    
  2. 用户代码
    • adc.c
      #include "circular_buffer.h"
      CircularBuffer cb;
      unsigned int storage[10];
      void main(void) {init_circular_buffer(&cb, storage, 10);while (1);
      }
      
  3. 配置
    • 在 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. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

相关文章:

  • 指针的神秘探险:从入门到精通的奇幻之旅 !

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词