🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。
🎯每天努力一点点,技术变化看得见
静态库
静态库的介绍及使用方法
在Linux系统中,静态库以.a
后缀结尾。我们可以进入/lib64目录下,使用ls -al | grep "\.a$"
查找当前目录下的静态库。↓↓↓
静态库的名称需要去掉前面的lib及后缀.a。如下图所示,该静态库的名称为util↓↓↓
程序在编译链接的时候把静态库库的代码链接到可执行文件中,程序运行的时候不再需要静态库。例如,我们需要使用libutil.a中的代码,在编译链接的时候,就将该库中的代码拷贝到待生成程序的代码中。
当使用静态链接生成的可执行程序被执行时,由于该程序已经包含了静态库中的代码,当其执行时就不再需要使用静态库,而是直接在该程序的正文代码段寻找对应的库代码即可。
gcc/g++编译器在默认情况下,都采用动态链接,只有用户在编译链接时显式带上-static
选项才会采用静态链接。我们对下方程序分别采用动态链接及静态链接↓↓↓
#include <stdip.h>
int main()
{
printf("Jammingpro\n");
return 0;
}
从上面的文件大小可以看出,静态链接的程序大小明显大于动态链接的程序大小。因为静态链接将使用到的库的可执行程序代码保存到其代码中,导致可执行程序的大小比较大。
自制静态库
在市面上,如果购买一个第三方库,我们将得到包含该库中的各个方法声明的头文件,及这些方法对应的实现生成的可执行程序(为了不让其他人知道这个方法的具体实现,故已经将这些方法的实现编译成可执行程序)。
下面,我们自制一个包含加减乘除函数的mymath静态库。我们需要包含一个mymath静态库的头文件,一个包含具体实现的mymath静态库。最终组成lib目录下保存include和mymathlib文件夹,这两文件夹内分别包含头文件及静态库↓↓↓
首先,我们需要提供包含各个函数声明的头文件(mymath.h)↓↓↓
#ifndef __MYMATH_H__
#define __MYMATH_H__
int add(int left, int right);
int sub(int left, int right);
int mul(int left, int right);
int div(int left, int right);
#endif
下面是上方各个函数声明的具体实现代码(mymath.c)↓↓↓
#include "mymath.h"