Linux——动静态库的制作和使用(实操+代码+原理介绍)

Linux——动静态库的制作和使用(实操+代码+原理介绍)_第1张图片

动静态库的制作和使用

  • 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)。

区别

  • 静态库的代码在编译时被复制到可执行文件中,使得可执行文件自包含,无需外部依赖。
  • 动态库的代码在运行时动态加载到内存中,多个程序可以共享同一个动态库,减少内存占用和可执行文件的大小。

使用动态库的优点包括:

  1. 节省内存和磁盘空间,多个程序可以共享同一个动态库。
  2. 允许在运行时更新和升级库,而无需重新编译整个程序。
  3. 支持动态链接,使得程序更灵活、易于维护和分发。

使用静态库的优点包括:

  1. 代码的嵌入性,可执行文件自包含,无需外部依赖。
  2. 可以确保程序与特定版本的库文件完全兼容。
  3. 选择使用动态库还是静态库,通常取决于项目的需求、开发环境和目标平台等因素。在实际开发中,通常会根据实际情况进行权衡和选择。

2️⃣静态库的制作

Q:库文件能不能有main()函数?

		A:不能 ,制作的库函数是给别人使用的,两个main函数会引起冲突! 

准备好库函数.h和.c文件

这里我以static.c static.h命名 写了个打印函数
Linux——动静态库的制作和使用(实操+代码+原理介绍)_第2张图片

  • ‍♀️ static.c
 #include"static.h"
    void _Printf(int i)                                                                                                                                                                    
    {
      while(i>0)
      {
     printf("这是一个静态库\n");
      i--;
      }
    }

  • static.h
 #pragma once 
    #include 
    void _Printf(int i); 

然后在test.c中包含头文件 static.h 这里跟我们平时在VS下写代码 声明和定义分离是一样的道理

  • ‍♂️test.c
  #include"static.h"
    int main()
    {
     _Printf(10) ;
     return 0;                                                                                                                                                                             
   }
    
~

做好这几部工作之后就到重头戏啦~

配置makefile

先看配置:
Linux——动静态库的制作和使用(实操+代码+原理介绍)_第3张图片

  • ‍♀️ 代码
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 中添加了三个规则== :
  1. libstatic.a 规则:用于生成静态库文件 libstatic.a,它依赖于 static.o 目标文件。
  2. static.o 规则:用于编译 static.c 生成目标文件 static.o。
  3. clean 规则:用于清理生成的文件。
    == 总结== :在这个 makefile 中,我们指定了要生成的可执行文件为 test,它依赖于 test.c 和 libstatic.a。同时,我们定义了生成静态库文件 libstatic.a 的规则,并指定它依赖于 static.o 目标文件。最后,我们定义了清理文件的规则。

通过修改 makefile 并重新运行 make 命令,你应该能够成功编译并链接包含自定义静态库的程序。

‍♂️运行测试

Linux——动静态库的制作和使用(实操+代码+原理介绍)_第4张图片

成功~ 这就成功

‍♀️

3️⃣ 4️⃣ 5️⃣ 6️⃣

未完待续~

你可能感兴趣的:(Linux,linux,运维,服务器)