动态链接,静态链接,动态链接库,静态链接库

程序生成可执行文件的过程中要经历:预处理à编译à汇编à链接四个步骤,其中链接的方式就包括静态链接和动态链接,说到动态链接和静态链接又不得不说到动态链接库和静态链接库。

众所周知,静态链接和动态链接是一种技术,也是应用程序或者链接库生成的链接方式,在链接生成可执行文件或者生成链接库的时候使用,而静态链接库和静态链接库只是包含着程序运行指令(可以看作代码)的一些文件,这些文件可以通过编译器生成,但是不可执行,它们的生成过程同样也需要经过预处理à编译à汇编à链接四个步骤。

 

以下将可执行文件和链接库统称应用程序

 

静态链接:使用静态链接的方式生成应用程序,在生成的的时候会将链接库中的所有指令(可以看作代码)直接包含在编译链接生成的应用程序中,每个应用程序都将具有静态链接库的代码副本,运行时占用内存较大

动态链接:使用动态链接的方式生成应用程序,在生成的时候不直接将链接库中的指令(可以看作代码)包含到编译链接生成的应用程序中,而是通过记录一系列符号和参数,在程序运行的时候将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后应用程序执行到指定的代码时,去执行内存中已经加载的动态库可执行代码。

 

注:动态链接和静态链接的使用只是在链接动态或者静态链接库生成应用程序的的时候

注:在生成静态链接库的时候可以链接动态链接库,这时候使用的是动态链接的方式,在生成动态链接库的时候可以使用链接静态链接库,这时候使用的是静态的链接方式

 

动态链接和静态链接产生的应用程序的区别:静态链接生成的应用程序不依赖任何的链接库但是应用程序可能比较大,动态链接生成的应用程序要依赖于链接库,不能独立的运行,但是应用程序都比较小,程序运行速度稍慢。

 

静态链接库:在windows系统下xx.lib文件为静态链接库,linux系统下xx.a为文件

动态链接库(动态共享库):在windows系统下xx.dll文件为动态链接库,linux系统下xx.so为文件

 

静态链接库和动态链接库的区别:

1.  静态链接库只在编译链接时用到,在运行时不需要,而动态链接库在编译链接和运行时都需要

2.  静态链接库是不能被多个应用程序共享的,多个应用程序使用同一个静态链接库可以看作是每个应用程序具有静态链接库的一个副本,动态链接库是供多个应用程序共享的,应用程序在执行的时候共享同一个加载到内存的动态链接库

在linux下使用gcc创建动态链接库和静态链接库

比如有以下文件:

"lib.c"
#include <stdio.h>
void lib1()
{ 
       printf(“lib1\n”);
}

"main.c"
int main()
{
	lib1();
}

编译动态链接库:

使用gcc lib1.c –fpic –shared –o liblib1.so 生成动态链接库liblib1.so

使用gcc main.c –o main –L. –llib1 动态链接链接库liblib1.so

此处-L后面的点指的是在当前路径下查找动态链接库

-l参数后面是链接库的名字去掉lib前缀和.so后缀

这样编译通过是没问题的,但是在运行是系统会提示无法找到动态链接库,原因是:

在程序运行期间,也需要告诉系统去哪里找你的动态链接库文件。在UNIX下是通过定义名为 LD_LIBRARY_PATH 的环境变量来实现的。只需将-L后的参数赋值给此变量即可

编译静态链接库:

首先使用gcc –c lib1.c生成对象文件

然后使用arr cr liblib1.a lib1.o 生成静态链接库liblib1.a文件

使用gcc main.c –o main –L. –llib1链接静态链接库liblib1.a

关于链接:

1.  使用gcc链接的时候,默认使用的是动态链接方式,如果链接的库是静态链接库,则会使用静态链接

2.  静态链接只能链接静态链接库,动态链接只能链接动态链接库





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值