前言

复习Linux的时候,竟然意外发现了一个学校没教的知识点分别是静态库和动态库的生成,学完之后就兴致勃勃来分享了。主要我也担心没过多久就忘了这个是怎么搞的,干脆写篇博文记录一下Linux里生成静态库的过程,主要功能还是供以后笔者复习查看。

缘起

本来是半梦半醒间看的Linux并发教程,突然听到一句如果公司不想让核心code流出,那就可以试试动态库和静态库这两个东西。突然间想到公司里的debug版本会变成release版本再交付给客户,然后会生成一堆乱码一样的文件,但也能顺利跑代码。这个回忆让我不禁怀疑起这两个是不是同样功能,但经过询问发现他们两个应该没什么关系,只是功能差不多,原理可能差十万八千里。萌发出了这个东西可能值得探究的想法

静态库的一些基本知识科普

静态库(Static Library)是一种在编译时被链接到程序中的库,其中包含了一些函数和数据。与动态库不同,静态库在编译时就被完整地复制到可执行文件中,因此不需要在运行时加载库文件。

1、静态库的文件格式通常为.a(在Linux和Unix系统中)或.lib(在Windows系统中)。

2、静态库可以由多个目标文件构成,每个目标文件可以由一个或多个源文件编译而成。

3、静态库的使用可以通过链接器(Linker)来实现。链接器会将可执行文件中未定义的符号(函数或变量)与静态库中的符号进行匹配,并将其复制到可执行文件中。

4、静态库中的函数和变量可以被多个可执行文件共享,这使得静态库成为了一个可复用的代码库。

5、静态库的优点是在编译时就已经被完整地复制到可执行文件中,因此在运行时不需要再次加载库文件,可以提高程序的运行效率和性能。

6、静态库的缺点是它的体积通常比较大,因为它包含了所有函数和数据的副本,这会占用更多的磁盘空间。

7、静态库的更新需要重新编译程序,这也使得静态库不太适合于需要频繁更新的程序。

总的来说,静态库是一种可复用的代码库,它的使用可以提高程序的运行效率和性能。静态库适用于不需要频繁更新的程序,并且适合于需要高性能和可移植性的应用

静态库怎么生成?

首先需要准备3个函数文件和1个主函数文件

创建完这四个.c文件后就可以进行下一步操作,进行编译。函数文件命名分别为fie1.c file2.c,file3.c和main.c

gcc -c file1.c file2.c file3.c

上述命令会生成三个目标文件,分别为file1.o、file2.o和file3.o。

ar rcs libmystatic.a file1.o file2.o file3.o

rcs选项用于创建一个静态库,libmystatic.a是静态库的名称,file1.o、file2.o和file3.o是需要打包的目标文件。
libmystatic.a中,.a是必须要有的库文件后缀,libmyatatic大概意思是我的静态库,可以自定义修改为其他名字。

使用静态库:使用静态库需要在编译时将其链接到目标程序中。例如,在使用gcc编译时,可以使用-l选项指定需要链接的静态库

gcc -o myprogram main.c -L. -lmystatic

-L.表示在当前目录下查找静态库,-lmystatic表示需要链接名为libmystatic.a的静态库。

在目标程序的源代码中包含静态库的头文件。例如,如果静态库的函数声明在mystatic.h文件中,可以在源代码中包含该文件:

#include "mystatic.h"

在目标程序的源代码中调用静态库中的函数。例如,如果静态库中包含一个名为myfunction的函数,可以在源代码中使用该函数:

int result = myfunction(10);

编译目标程序。可以使用如下命令:,main.c为目标程序的源代码文件,-L.和-lmystatic选项用于链接静态库。

gcc -o myprogram main.c -L. -lmystatic
//运行目标程序。可以使用如下命令:
./myprogram

结果就是将函数文件.c删除后主函数依然可以运行

后记

上个月换了新笔记本电脑,很多环境还是没有搭建好,所以没有照着尝试,如果这个流程有问题可以评论区提出,敦促笔者改正。

04-06 18:50