静态链接库与动态链接库的使用

静态链接库的使用
1.生成目标文件
         gcc -c -o test.o test.c
2.归档目标文件到静态链接库test中
         ar -rcs -o libtest.a test.o
补充:可以使用ar -t libtest.a查看静态链接库包含哪些目标文件
3.使用静态链接库
          gcc -o main.c -ltest   //要求静态链接库在系统目录下(/lib,/usr/lib,不包括其子目录)
          gcc -o main.c -L dir -ltest  //指定静态链接库所在的目录
     注意:-ltest也可以换成libtest.a,也适用于动态链接库;连接静态库需要注意间接依赖问题



动态链接库的使用
1.使用-fPIC或-fpic选项生成目标文件,该参数告诉gcc生成的代码是位置无关的
       gcc -c -o test.o -fpic test.c
2.使用-shared选项生成动态链接库
       gcc -shared -o libmyshare.so test.o
补充:上述两个命令也可以一起使用:gcc -shared -fpic -o libmyshare.so test.c
3.编译时使用动态链接库,有两种使用方法
方法一:gcc -o app_share main.c -lmyshare
说明:这种方法要求libmyshare.so库必须在系统目录下(/lib,/usr/lib)而不能在任何其他目录下(包括系统目录的子目录)。
方法二:gcc -o app_share main.c -L dir -lmyshare  (dir为库文件所在的目录)
说明:不管库文件在什么目录下,只要dir参数能正确指定库文件所在的目录,这种方法就能正确编译通过,但是此种方法生成的可执行文件不能正确运行,要想正确运行可执行文件,需要将库文件拷贝到系统目录下(/lib,/usr/lib)或者/etc/ld.so.conf文件指定的目录下并且执行ldconfig指令。

动态链接库需要安装,否则程序运行时会找不到所需要的动态链接库。可以安装到系统目录下或者/etc/ld.so.conf文件规定的目录下。/etc/ld.so.conf文件规定了系统动态链接库的搜索路径(/etc/ld.so.conf文件不包含系统目录),其中就包含/usr/local/lib路径,这也就是为什么我们需要将一些第三方库安装到/usr/local/lib目录下的原因
 

4.运行时对动态链接库的要求
可执行文件运行时会在系统目录和缓存文件/etc/ld.so.cache中寻找动态链接库,缓存文件/etc/ld.so.cache中含有动态链接库的列表,所以当将库文件拷贝到系统目录下时,不需要执行ldconfig命令。但是如果将库文件拷贝到/etc/ld.so.conf配置文件指定的目录中则需要执行ldconfig指令。/etc/ld.so.conf配置文件存放着程序运行时动态链接库的搜索路径(系统目录/lib,/usr/lib除外),多个目录间以空白字符或冒号或逗号或换行分隔。
补充:编译时对动态链接库路径的要求与运行时不一样,编译时默认只在系统目录下搜索,运行时不仅会在系统目录下搜索还会在/etc/ld.so.cache中搜索。

注意:编译时使用动态链接库只是往程序中插入楔子,程序运行时还是要再一次连接动态链接库

5.动态链接库的管理命令ldconfig
ldconfig:将系统目录(/lib,/usr/lib)和/etc/ld.so.conf配置文件中所包含路径下的动态链接库刷新到缓存文件/etc/ld.so.cache
ldconfig -p:列出缓存文件/etc/ld.so.cache中的动态链接库列表
ldconfig -v:列出缓存文件/etc/ld.so.cache中的动态链接库列表,并且显示动态链接库所在的目录。
ldconfig dir:当用户目录并不在配置文件/etc/ld.so.conf中时,可以指定dir,将用户指定的目录中的动态链接库放入缓件/etc/ld.so.cache中,从而使库被共享;但是如果再次执行ldconfig命令,缓存文件/etc/ld.so.cache被刷新,dir目录中指定的动态链接库将不在可被共享。

6.动态链接库的动态加载:以上所说的方法是在程序启动时寻找动态链接库,找到库函数;动态加载可以在程序中控制什么时候寻找库函数。
动态加载时需要包含头文件dlfcun.h,编译时不需要包含动态链接库,但是需要加上-ldl选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值