静态库与动态库


前言

我们通常把一些公用函数制作成函数库,供其它程序使用。
函数库分为静态库动态库两种。
①、静态库:在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。静态库的名字一般是libxxx.a(Linux),xxx是该lib的名称。
②、动态库:在程序编译时不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。动态库的名字一般是libxxx.so(Linux),有时候也是 libxxx.so.major.minor,xxx是该lib的名称,major是主版本号, minor是副版本号。

一、静态库生成

1、step1:将.c文件编译成.o文件

gcc -o test1.o  -c test1.c
gcc -o test2.o  -c test2.c

2、step2:编译成静态库 libxxx.a

ar crs libtest.a test1.o test2.o

3、使用:

gcc -o main main.c  -static -L(库目录) -ltest 

-l指定哪个库 -L指定库路径

makefile:
libtestS:
gcc -c test1.c
gcc -c test2.c
ar cr libtest.a test1.o test2.o
mainS:
gcc -o ${mainS} main.c -static -L. -ltest

二、动态库生成

1、step1:将.c文件编译成.o文件

gcc -o test1.o  -c test1.c
gcc -o test2.o  -c test2.c

2、step2:编译成动态库 libxxx.so

gcc -shared -fpic -o  libtest.so test1.o test2.o

3、使用:

gcc -o main main.c  -L(库目录) -ltest 

-l指定哪个库 -L指定库路径

makefile:
libtestD:
gcc -c test1.c
gcc -c test2.c
gcc -shared -fpic -o libtest.so test1.o test2.o
mainD:
gcc -o ${mainD} main.c -L. -ltest


三、利用动态库做成的程序无法运行?

原因:为在动态函数库使用时,会查找/usr/lib、/lib目录下的动态函数库,而此时我们生成的库不在里边。

3个解决方法
(1)最直接最简单的方法就是把so拉到/usr/lib或/lib中去,但这好像有点污染环境吧?
(2)export LD_LIBRARY_PATH=$(pwd) 即把当前目录导入全局变量LD_LIBRARY_PATH。这样程序运行就会找到当前目录下的库文件了。
(3)可以在 /etc/ld.so.conf 文件里加入我们生成的库的目录,然/sbin/ldconfig

关于/etc/ld.so.conf
/etc/ld.so.conf里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 。
关于/etc/ld.so.cache
/etc/ld.so.cache里面保存了常用的动态函数库,且会先把他们加载到内存中,因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值