转:

博客介绍了使用readelf命令查看文件依赖库,展示了文件目录树及相关代码。详细说明了静态库和动态库的制作与链接方法,如静态库做成liblt.a并链接,动态库做成liblt.so,有拷贝到系统库再链接和手动指定库路径两种链接方式,还对比了静态与动态链接的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你可以使用readelf命令就可以看出一个文件的依赖库 readelf -d *.exe

http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html

文件预览
文件目录树如下,如你所见,非常简单。
libtest/
|– lt.c
|– lt.h
`– test.c
代码

lt.c

/* lt.c
*
*/

include

lt.h

/* lt.h
*
*/

void myprint(void);

test.c

/* test.c
*
*/

include “lt.h”

int main(void)
{
myprint();
return 0;
}
先看静态库
首先做成静态库 liblt.a 。

gccclt.colt.o g c c − c l t . c − o l t . o ar cqs liblt.a lt.o

再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。

$ gcc test.c liblt.a -o test

这个时候再来看他的引用库情况。

$ ldd test //ldd 是用来查看链接那些动态链接库
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7e29000)
/lib/ld-linux.so.2 (0xb7f6e000)
动态库
做成动态库 liblt.so 。

gccclt.colt.o g c c − c l t . c − o l t . o gcc -shared -Wall -fPIC lt.o -o liblt.so

链接方法I,拷贝到系统库里再链接,让gcc自己查找

sudocpliblt.so/usr/lib s u d o c p l i b l t . s o / u s r / l i b gcc -o test test.o -llt
这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索 lib[lib_name].so 。这个搜索的路径可以通过 gcc –print-search-dirs来查找。
链接方法II,手动指定库路径

$ cc -o test test.o -llt -B /path/to/lib
这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II 中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系 统变量 LD_LIBRARY_PATH :

$ export LD_LIBRARY_PATH=/path/to/lib

这个时候再来检测一下test程序的库链接状况(方法I情况)

$ ldd test
linux-gate.so.1 => (0xffffe000)
liblt.so => /usr/lib/liblt.so (0xb7f58000)
libc.so.6 => /lib/libc.so.6 (0xb7e28000)
/lib/ld-linux.so.2 (0xb7f6f000)
恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值