动态库和静态库

先抄一段 windows下的动态库和静态库区别解释,其实linux下意义一样的,不过后缀名有些区别

静态库:在编译的时候加载生成目标文件,在运行时不用加载库,在运行时对库没有依赖性。 
动态库:在目标文件运行时加载,手动加载,且对库有依赖性。 

两者区别: 
一,静态库的使用需要: 
1 包含一个对应的头文件告知编译器lib文件里面的具体内容 
2 设置lib文件允许编译器去查找已经编译好的二进制代码 

二,动态库的使用: 
程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库 

三,依赖性: 
静态链接表示静态性,在编译链接之后, lib库中需要的资源已经在可执行程序中了, 也就是静态存在,没有依赖性了 
动态,就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供 需要的 动态库,有依赖性, 运行时候没有找到库就不能运行了 

四,区别: 
简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。 
做成静态库可执行文件本身比较大,但不必附带动态库 
做成动态库可执行文件本身比较小,但需要附带动态库 

五: 
有三个概念:Use   static   libary,   static   linked   DLL,   dynamic   linked   DLL. 
多数人混淆了static   libary   和   static   linked   DLL的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明。 
        使用静态库(Use   static   libary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等。一般情况下,可以根本就没有“对应的”.dll   文件,如C   Run   Time(CRT)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”。实际上那多出来的部分就是CRT静态库。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现。 
    



    linux下具体实现

静态库 

假设一个xxx.o文件

ar -rsv  xxx.a xxx.o  建立一个xxx.a 静态库

ar -t xxx.a   查看具体的静态库包含内容

gcc -o xx xx.c -L./xx,a  xx.c 可以使用xx.a 的函数啦啦

gcc -o xx xx.c -lxx 也可以

动态库

gcc  -fpic   -shared  -o xxx.so  xxx.o    建立动态库

gcc -o xx  xxx.c xxx.so 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值