
动静态库的制作和使用
- 1️⃣.动静态库介绍
- 🏀静态库
- ⚽️动态库
- 🏈区别
- 🏐使用动态库的优点包括:
- 🏉 使用静态库的优点包括:
 
- 2️⃣静态库的制作
- 🍊Q:库文件能不能有main()函数?
- 🍋准备好库函数.h和.c文件
- 🍌 配置makefile
- 🧏🏿♂️运行测试
 
- 3️⃣ 4️⃣ 5️⃣ 6️⃣
1️⃣.动静态库介绍
🍏动态库(Dynamic Library)和静态库(Static Library)是在软件开发中常用的两种库文件形式。
🏀静态库
静态库是一组已编译的目标文件的集合,它们被打包成一个单独的文件。当程序链接时,编译器会将静态库的目标文件直接嵌入到最终的可执行文件中。静态库在编译时被完整地复制到可执行文件中,使得可执行文件成为一个独立、自包含的实体。这意味着程序运行时不需要额外的库文件支持,所有所需的代码都已嵌入到可执行文件中。静态库的扩展名通常是 .a(对于UNIX/Linux)或 .lib(对于Windows)。
⚽️动态库
相比之下,动态库是一组已编译的目标文件的集合,它们在运行时由操作系统动态加载到内存中。当程序链接时,编译器只会在可执行文件中包含动态库的引用,而不会将实际的代码嵌入到可执行文件中。程序在运行时,通过动态链接器(如 Windows 的 DLL 动态链接库或 UNIX/Linux 的共享对象文件 .so)将动态库加载到内存,并与可执行文件进行连接。动态库的扩展名通常是 .so(对于UNIX/Linux)或 .dll(对于Windows)。
🏈区别
- 静态库的代码在编译时被复制到可执行文件中,使得可执行文件自包含,无需外部依赖。
- 动态库的代码在运行时动态加载到内存中,多个程序可以共享同一个动态库,减少内存占用和可执行文件的大小。
🏐使用动态库的优点包括:
- 节省内存和磁盘空间,多个程序可以共享同一个动态库。
- 允许在运行时更新和升级库,而无需重新编译整个程序。
- 支持动态链接,使得程序更灵活、易于维护和分发。
🏉 使用静态库的优点包括:
- 代码的嵌入性,可执行文件自包含,无需外部依赖。
- 可以确保程序与特定版本的库文件完全兼容。
- 选择使用动态库还是静态库,通常取决于项目的需求、开发环境和目标平台等因素。在实际开发中,通常会根据实际情况进行权衡和选择。
2️⃣静态库的制作
🍊Q:库文件能不能有main()函数?
		A:不能 ,制作的库函数是给别人使用的,两个main函数会引起冲突! 
🍋准备好库函数.h和.c文件
这里我以static.c static.h命名 写了个打印函数
 
- 🙋🏿♀️ static.c
 #include"static.h"
    void _Printf(int i)                                                                                                                                                                    
    {
      while(i>0)
      {
     printf("这是一个静态库\n");
      i--;
      }
    }
- 🙋🏿static.h
 #pragma once 
    #include <stdio.h>
    void _Printf(int i); 
然后在test.c中包含头文件 static.h 这里跟我们平时在VS下写代码 声明和定义分离是一样的道理
- 🙋🏿♂️test.c
  #include"static.h"
    int main()
    {
     _Printf(10) ;
     return 0;                                                                                                                                                                             
   }
    
~
做好这几部工作之后就到重头戏啦~
🍌 配置makefile
先看配置:
 
- 🧏🏿♀️ 代码
test: test.c libstatic.a
      gcc -o $@ $^ -std=c99
    
    libstatic.a: static.o
      ar rcs $@ $^
    
   static.o: static.c static.h
      gcc -c -o $@ $< -std=c99
    
   .PHONY: clean
   clean:
     rm -f test libstatic.a static.o                                                                                                                                                      
   
- 🧏🏿 代码介绍
 == 这个 makefile 中添加了三个规则== :
- libstatic.a 规则:用于生成静态库文件 libstatic.a,它依赖于 static.o 目标文件。
- static.o 规则:用于编译 static.c 生成目标文件 static.o。
- clean 规则:用于清理生成的文件。
 == 总结== :在这个 makefile 中,我们指定了要生成的可执行文件为 test,它依赖于 test.c 和 libstatic.a。同时,我们定义了生成静态库文件 libstatic.a 的规则,并指定它依赖于 static.o 目标文件。最后,我们定义了清理文件的规则。
通过修改 makefile 并重新运行 make 命令,你应该能够成功编译并链接包含自定义静态库的程序。
🧏🏿♂️运行测试

成功~ 这就成功
🤦🏿♀️ 🤦🏿
🍉 🍇 🍓 🍈 🍒 🍑 🥭 🍍
3️⃣ 4️⃣ 5️⃣ 6️⃣
未完待续~











![线程栈溢出异常,程序崩溃在汇编代码test dword ptr [eax],eax上的问题排查](https://img-blog.csdnimg.cn/936e39ca9b404af99a7166a621d44fe7.png)







