朋友们、伙计们,我们又见面了,本期来给大家带来动静态库相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux
目录
1. 静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库(静态库不需要加载);静态库的前缀以lib开头中间是库名称以.a为后缀结束。
库中是没有main函数的,我们也不能把main函数写入库中!
将所有头文件和.o文件打包就叫做一个库。
1.1 静态库的创建
实现一个简单的计算功能的代码:包含 + - *功能的计算。
// 源Add.c #include "Add.h" int Add(int x,int y) { return x + y; } // 源Sub.c #include "Sub.h" int Sub(int x,int y) { return x - y; } // 源Mul.c #include "Mul.h" int Mul(int x,int y) { return x * y; } // 源Test.c #include "Add.h" #include "Sub.h" #include "Mul.h" int main() { int x = 10, y = 20; printf("%d + %d = %d\n", x, y, Add(x, y)); printf("%d - %d = %d\n", x, y, Sub(x, y)); printf("%d * %d = %d\n", x, y, Mul(x, y)); return 0; }
我们可以对全部的.c源文件一起编译形成一个可执行程序:
但是我们不建议将所有的源文件一起编译成可执行程序,通常先将所有的.c文件预处理、编译、汇编形成.o文件,然后使用哪几个源文件就将哪几个链接在一起(所以在VS2019中可以看到许多的.obj文件)。
gcc -c 源文件:将源文件汇编形成.o二进制目标代码;
为了方便,我们直接使用Makefile来自动形成.o文件和链接.o文件形成可执行。
Makefile文件:
Test:Add.o Sub.o Mul.o Test.o #将所有.o文件链接在一起形成可执行 gcc -o $@ $^ %.o:%c #将所有的.c文件汇编形成.o文件 gcc -c $< .PHONY:clean clean: rm -f *.o Test
如果我们要形成一个库,只需要将.o文件和头文件保留,然后打包,如果用户有别的程序要使用,先将用户的源代码汇编形成.o文件,然后再和我们库中的.o文件链接即可。
静态库的创建:ar -rc lib库名称.a .o文件...
// 生成静态库 [root@localhost linux]# ar -rc libmymath.a add.o sub.o
为了方便,在Makefile中也可以使用生成静态库的脚本:
Makefile文件:
static-lib=libmymath.a $(static-lib):Add.o Sub.o Mul.o ar -rc $@ $^ %.o:%c gcc -c $< .PHONY:clean clean: rm -f *.o *.a
静态库的本质:将库中的源代码直接翻译成为.o目标二进制文件,然后将其打包!