Linux—静态库与共享库——详解

目录

一.库

二.静态库

三.共享库


一.库

1.库的定义

库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。本质上,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。简单的理解为中间文件的集合或某些功能代码的集合。

2.几种文件的存放路径

  • 库文件:/lib 或 /usr/lib
  • 头文件:/usr/include
  • 可执行程序(命令):/bin 或 /usr/bin

3.库文件和头文件之间的关系

区别:

  • 头文件是文本文件,是可供阅读的;库文件是二进制文件,不可直接阅读。
  • 头文件在编译中使用;库文件在链接中使用。
  • 头文件中是函数或定义的声明,及少量内联函数的使用,一般不包含非静态函数实现;库文件中包含函数的实现。
  • 头文件是手动编写的,库文件是编译生成的。

联系:

  • 虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口函数所在的头文件。
  • 一个库文件均有一组头文件与其对应。
  •  库文件和对应头文件的作者应为同一个。
  • 作者必须保证头文件中所声明的函数类型及参数列表,与库文件中的实现是相同的。

简单的来说,头文件中有函数的申明,库文件实现函数的定义。库文件通过头文件向外导出接口,用户通过头文件找到库文件中

函数实现的代码从而把这段代码链接到用户程序中去

4.库文件的分类

  • 静态库
  • 共享库

二.静态库

1.定义

静态库也是一种库文件,它在链接间段直接将库中的内容合并到最终的可执行文件中,所以静态库最终生成的可执行文件最终执行时,并不依赖库文件,即删除静态库,​但由于静态库方法已经被包含在了可执行程序中,则程序仍可执行,不再依赖于外部静态库。

2.静态库的优缺点

静态库的运行速度快,但程序体积相对较大,不易版本升级,若升级,则程序需要重新编译;

3.静态库的扩展名

               Linux中        Window中
                    .a              .lib

4.静态库的前缀

lib

5.静态库的生成与使用

假设现在有如下的四个文件

my.h

int max(int a,int b);

int add(int a,int b);

myadd.c

#include "my.h"
int add(int a,int b)
{
	return a+b;
}

mymax.c

#include "my.h"
int max(int a,int b)
{
	return a>b?a:b;
}

mymain.c

#include <stdio.h>
#include <stdlib.h>
#include "my.h"

int main()
{
	int a=23;
	int b=33;
	printf("add=%d max=%d\n",add(a,b),max(a,b));
	exit(0);
}

接下来我们要将myadd.c 和 mymax.c制作成静态库

1首先我们将所有的 .c文件编译成 .o文件

使用命令

gcc -c myadd.c

gcc -c mymax.c

gcc -c mymain.c

2接着我们将 myadd.o 和 mymax.o 做成静态库,并将静态库起名为myfoo——静态库的生成

使用命令

ar crv libmyfoo.a myadd.o mymax.o

3最后我们直接编译mymain.c,并且使用静态库libmyfoo.a——静态库的使用

使用命令

gcc -o mymain mymain.c  -L  .  -lmyfoo

注:

上述命令中的libmyfoo.a,其中,lib代表的是静态库的前缀,.a代表的是静态库的后缀,只有二者中间的myfoo才代表静态库的名字。

静态库的使用方法

例如

三.共享库

1.定义

共享库与静态库不同,共享库在链接间段只在可执行文件中设置使用的库,运行时由操作系统动态加载到内存上执行

2.共享库的优缺点

共享库是在运行程序时才动态加载库方法,若删除共享库,则程序运行时进行动态加载库方法时找不见共享库,程序将无法执行。共享库由于运行要动态加载库文件,则运行速度慢,但程序体积小,方便版本升级,程序不用重新编译

3.共享库的扩展名

            Linux中        Window中
                .so              .dll

4.共享库的前缀 

lib

5.共享库的生成与使用

所用代码和静态库代码相同

1首先我们将所有的 .c文件编译成 .o文件,使用命令

gcc -c myadd.c

gcc -c mymax.c

gcc -c mymain.c

2接着我们将 myadd.o 和 mymax.o 做成共享库,并将共享库起名为MYfoo——共享库的生成

使用命令

gcc -shared -fPIC  -o  libMYfoo.so  *.o

因为操作系统只会加载 /lib 和 /usr/lib两条路径下的共享库,所以我们选择将libMYfoo.so放入/usr/lib路径下

注:这里要切换为管理员模式,因为普通用户的权限不够

命令

cp libMYfoo.so  /usr/lib

3最后我们直接编译mymain.c,并且使用共享库libMYfoo.so——共享库的使用

使用命令

gcc -o mymain mymain.c  -L  .  -lMYfoo

注:

上述命令中的libMYfoo.so,其中,lib代表的是共享库的前缀,.so代表的是共享库的后缀,只有二者中间的MYfoo才代表共享库的名字。

共享库的使用方法与静态库相同。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值