1.库文件
2.静态库
都以.a结尾。
在/usr/lib/libc.a下
ar:建立归档文件
-c:阻止编译器创建一个完整的程序
静态链接
程序在编译链接的时候,会把库中的代码链接复制到可执行文件中。程序在运行的时候将不再需要动态库。
而这种在链接是所做的复制操作,就是静态链接。
静态库的生成
gcc -c test.c -o test.o
//将test.c文件编译生成test.o的机器指令
ar -cr libtest.a test.o
//打包将test.o -c创建-r模块替换 生成“lib”为前缀,“.a”为后缀的静态库文件
调用自定义的静态库文件
gcc main.c -L. -ltest
//将main.c在(-L)指定的库路经 "."当前路径下链接(-l)指定库名test(lib 和.a前缀后缀都省略) 。
静态库链接
在系统中默认是动态链接,那么如果我想要静态链接库文件
gcc --static test.c
linux下的静态库可能没有安装,如果显示失败,需要用户通过yum命令
yum install glibc-static来安装静态库。
3.动态库
程序在运行的时候才去链接动态库的代码,而多个程序共享的使用库中的代码,而我们的系统中,就默认采用的这种方式链接的。
动态库是一个运行时库,需要在程序运行的时候把动态库也加载到内存中,并这个加载的过程是操作系统操作的,操作系统会在特定的位置寻找该库,所以需要我们将动态库文件存在在指定目录下,才可运行。
动态链接
在执行文件开始之前外部的函数的机器码由系统从磁盘上对应的该动态库中复制一份到内存中,这个过程就是动态链接。
动态库的生成:
gcc -fPIC -c test.c -o test.o
//这句话的意思就是把test.c文件编译成名为test.o的机器指令
gcc --share test.o -o libtest.so
//将test.o文件打包成动态库“lib”是动态库前缀,“.so”是后缀
4,访问数据库:-I
-L:选项来告诉编译器在何处找到
¥gcc -o 文件名 文件名.o -L. -Ifoo
ldd:来查看一个程序所需要的共享库(ldd 文件名)
库函数:查看可执行程序用到哪些共享库 命令:ldd
共享库:libxx.so:运行时,动态加载进去
静态库:libxx.a :包含在可执行程序中
问题:
(2)静态库制作命令及参数
不管是静态函数库还是动态函数库,都是由*.o目标文件生成。
add.c和sub.c都是给定的
gcc -c add.c
gcc -c sub.c
生成add.o sub.o
而后,静态函数库由ar命令创建
ar -cr libaddsub.a add.o sub.o
参数:
-c create的意思
-r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
静态函数库创建完毕。
使用方法:
通过
gcc -o main main.c -L. -laddsub
编译main.c就会把静态函数库整合进main。
(3)共享库制作命令及参数
gcc -shared -fpic -o libaddsub.soadd.c sub.c
参数
-fpic:产生位置无关代码
-shared:生成共享库
用上述命令生成libaddsub.so 动态函数库。
gcc -o out main.c -L. -laddsub
此时还不能立即./out,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边。
几种方法可以让他成功运行:
1.最直接最简单的方法就是把libaddsub.so拉到/usr/lib 或/lib中去。
2.还有一种方法,假设libaddsub.so在/home/linux/addsub
export LD_LIBRARY_PATH=/home/linux/addsub:$LD_LIBRARY_PATH
3.另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig
(4)静态库与共享库的使用区别
不同:
1.动态库是运行时系统调用库函数实现链接,代码较小巧,
而静态库是在链接时复制到代码中,代码量较庞大,冗余度高。
2.正因为静态库这种方式也决定了她,在链接后不再依赖静态库存在,及即使静态库被删除程序依然可以正常运行,可移植性强。
而动态库因为是利用本机的库函数,所以可能移植到其他电脑会出现运行bug等问题,可移植性差。
3.他俩的区别在于链接过程的差异,和代码被载入的时刻不同
4.动态库必须放在指定的目录下完成链接,而静态库给出链接文件路径即可
相同:
1.库文件中都不可以出现主mian函数
2.这些库都是提供函数接口,满足功能的,不暴露源代码
3.目的增加代码复用,可共享性,减小冗余
(5)库文件和可执行文件异同
不同:
1.只要是库文件,文件中就不可以有mian函数。
而可执行文件,必须有且只有一个mian函数。
相同:
1.无论是可执行文件还是库文件都需要编译至少到.o形式的机器代码文件