库Lib(库的定义,分类静态库动态库的制作,总结)

头文件: .h结尾的文件

#include <stdio.h>

<>: 代表去系统路径下查找头文件/usr/include

#include "head.h"

"": 先从当前目录下查找头文件,找不到再去系统路径下查找

头文件以.h结尾,包含: 其他头文件引用,结构体、共用体和枚举的定义,宏定义,重定义,函数的声明,外部引用,条件编译。

源文件: .c结尾的文件

包含main函数的xx.c

包含子函数的xx.c,封装的函数可以在头文件中声明。

库文件(不能包含main函数)

1.库的定义

当使用别人的函数时除了包含头文件以外还要有库

头文件:函数声明,结构体等类型的定义,头文件,宏定义,其他头文件等等

库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。

由于windows和linux的本质不同,因此而这库的二进制是不兼容的。(Linux中的C运行库是glibc, 由GUN发布。)

2.库的分类

静态库和动态库,本质上的区别是代码被载入的时刻不同。

2.1静态库

静态库在程序编译时会被复制到目标代码中,以.a结尾

优点:程序运行时不再需要该静态库,运行的时候不需要加载库,运行的速度更加快,可移植性比较好

缺点:静态库中的代码复制到了程序中,因此体积比较大。静态库升级后,程序需要重新编译链接

2.2动态库

动态库是在程序运行时才被载入代码的,也叫共享库,以.so结尾

优点:程序在执行时加载动态库,代码体积小,升级更加的方便

缺点:运行的速度相对较慢,运行时还需要动态库的存在,移植性比较差

3.静态库的制作

1.将源文件编译生成目标文件

gcc -c fun.c -o fun.o

2.创建静态库用ar命令,将多个.o生成.a

ar crs libfun.a fun.o

注意:静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a

3.测试使用静态库

gcc main.c -L. -lfun

注意:-L指定静态库的路径, -l指定库名

执行: ./a.out

4.动态库的制作

 1.用gcc来创建共享库

gcc -fPIC -c fun.c -o fun.o //-fPIC创建与地址无关的编译程序

gcc -shared fun.o -o libmyfun.so //生成动态库

 2.测试使用动态库

sudo cp libmyfun.so /lib

gcc main.c -lmyfun

./a.out : 可以正常编译通过,但是运行报错./a.out: error while loading shared libraries: libmyfun.so: cannot open shared object file: No such file or directory

原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件,所以不用-L加路径了直接gcc main.c  -lmyfun就可以了

解决方法3种

(1)把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)

(2)在LD_LIBRARY_PATH环境变量中加上库所在的路径

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

(终端关闭,环境变量就没在了)

(3)添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

添加动态库存在的路径,如:

/home/hq/work/lib

5.动态库和静态库的总结

静态库:编译阶段,体积大,移植性好,升级麻烦,以.a结尾

动态库:运行阶段加载代码,体积小,移植性差,升级简单,以.so结尾

可以看出静态库编译出来的程序体积要大一些

升级演示:改变制作成库的源文件,然后重新制作库文件

动态库只需要重新生成动态库,不需要重新编译连接库了

静态库升级需要重新编译:

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值