文章目录
一、库
库:
- 是一组预先编译好的方法的集合
- linux系统库存储的位置一般在/lib /usr/lib,在64位系统上有些库也可能被存储在/usr/lib.64下
- 库文件一般被存储在/usr/include下或其目录下。
库的分类:
- 静态库(命名规则:libxxx.a)
- 共享库/动态库(命名规则:libxxx.so)
二、动态库与静态库
- 静态库是指编译链接时,将库文件的代码全部加入到可执行文件中,这样运行时就不需要库文件了,但此时生成的可执行文件比较大。静态库的后缀名一般为“.a”。
- 动态库(共享库)是指在编译链接时并不将库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库文件,这样可以节省系统的开销。动态库的后缀名一般为“.so”。
- 在源程序中包含头文件时,如果所包含的头文件位于系统默认包含路径之内,只需给出头文件的名字即可,不需指定路径;如果所包含的头文件位于系统默认包含路径之外,则需要在编译时使用-I选项来指定头文件的路径。例如:
- gcc example.c -o example -I/home/xxx/include
- 头文件所对应的库文件,如果没有特别指定时,gcc会到默认的搜索路径下进行查找。如果库文件不在上述目录中,在编译时就需要使用-L选项来指定库文件的路径。例如:
- gcc example.c -o example –L/home/xxx/lib
- 说明:Linux系统中头文件的默认包含路径可以通过环境变量C_INCLUDE_PATH来设定,库文件的默认搜索路径可以通过环境变量LIBRARY_PATH来设定,程序运行时加载动态库的查找路径可以通过环境变量LD_LIBRARY_PATH来设定。
静态库使用方法
1.生成静态库
- 先将所有要生成库文件的.c文件编译为.o文件
- 创建静态库,使用ar命令
- ar crv libxx.a xxx.o xxx.o
- 其中,ar:生成静态库,c:创建库,r:将方法添加到库中,v:显示过程
2.静态库使用库
- 命令:
- gcc -o main main.c -L. -lxxx
- -L:指明使用库
- -l:指定库名的名称(不需要lib和扩展名.a)
3.对静态库举例
- 以该main文件为例,内部调用了add(相加函数)和max(求最大值)函数,输出求解结果:
- 如果在编译时,不加add.c和max.c就会报错,如下:
- 在该情况下,只有将add.c和max.c加上,才能如下图正常编译出来:
- 此时将max和add函数设为静态库foo使用,解决该问题(不调用add.c和max.c而正常运行):
图示为创建foo.h头文件以及在main函数加入foo.h头文件
- 做法:
- 1.生成静态库
- 先将所有要生成库文件的.c文件编译为.o文件
- 创建静态库,使用ar命令(ar crv libxx.a xxx.o xxx.o)
- 2.使用库(gcc -o main main.c -L. -lxxx)
根据上述步骤就可看出编译成功啦~
共享库
1.引入共享库
- 静态库缺点:当你同时运行许多应用程序,并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本。而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间,因此引入共享库。
- 共享库:需要时才调用
2.共享库的生成
- 先将所有要生成库文件的.c文件编译为.o文件
- 打包生成共享库
gcc -shared -fPIC -o libxxx.so xxx.o xxx.o
3.共享库的使用
gcc -o main main.c -L. -l库名
4.注意:共享库需要放在标准路径下
sudo mv libxxx.so /user/lib
补充:查看使用了哪些共享库
ldd main
5.对共享库举例
- 生成静态库
- 先将所有要生成库文件的.c文件编译为.o文件
- 打包生成共享库(gcc -shared -fPID -o libxxx.so xxx.o xxx.o)
- 使用库(gcc -o main main.c -L. -lxxx)
上面的运行报错了因为没有将共享库移到标准库内,而系统查找时一般在标准库内,也就是lib位置,没找到,因此会报错,下面移动位置:
根据上述步骤就可看出编译成功啦~
共享库和静态库区别
- 静态库:方法包含到库里面,体积大;
- 共享库:方法没有包含进去,只是做了一个标记,体积小;共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);共享库便于升级。