动静态库的制作和使用
- 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️⃣
未完待续~