简介 Linux 静态与动态链接库
2013-05-24 20:12
274 查看
http://helloxy.iteye.com/blog/137460
[初级]
[作者] Wick
文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。
文件目录树如下,如你所见,非常简单。
libtest/
|-- lt.c
|-- lt.h
`-- test.c
#lt.c
/* lt.c
*
*/
#include <stdio.h>
void myprint(void)
{
printf("Linux library test!\n");
}
# lt.h
/* lt.h
*
*/
void myprint(void);
#test.c
/* test.c
*
*/
#include "lt.h"
int main(void)
{
myprint();
return 0;
}
首先做成静态库 liblt.a 。
$ gcc -c lt.c -o lt.o
$ ar cqs liblt.a lt.o
再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。
$ gcc test.o liblt.a -o test
这个时候再来看他的引用库情况。
$ ldd test
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7e29000)
/lib/ld-linux.so.2 (0xb7f6e000)
做成动态库 liblt.so 。
$ gcc -c lt.c -o lt.o
$ gcc -shared -Wall -fPIC lt.o -o liblt.so
链接方法I,拷贝到系统库里再链接,让gcc自己查找
$ sudo cp liblt.so /usr/lib
$ 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 ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
[初级]
[作者] Wick
文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。
文件预览
文件目录树如下,如你所见,非常简单。libtest/
|-- lt.c
|-- lt.h
`-- test.c
代码
#lt.c/* lt.c
*
*/
#include <stdio.h>
void myprint(void)
{
printf("Linux library test!\n");
}
# lt.h
/* lt.h
*
*/
void myprint(void);
#test.c
/* test.c
*
*/
#include "lt.h"
int main(void)
{
myprint();
return 0;
}
先看静态库
首先做成静态库 liblt.a 。$ gcc -c lt.c -o lt.o
$ ar cqs liblt.a lt.o
再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。
$ gcc test.o liblt.a -o test
这个时候再来看他的引用库情况。
$ ldd test
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7e29000)
/lib/ld-linux.so.2 (0xb7f6e000)
动态库
做成动态库 liblt.so 。$ gcc -c lt.c -o lt.o
$ gcc -shared -Wall -fPIC lt.o -o liblt.so
链接方法I,拷贝到系统库里再链接,让gcc自己查找
$ sudo cp liblt.so /usr/lib
$ 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 ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
相关文章推荐
- 简介 Linux 静态与动态链接库
- linux中的动态链接库与静态连接库
- linux 创建 静态 链接库 动态 链接库
- 解析Linux静态与动态链接库的创建和使用
- linux链接库(动态/静态)的使用详解
- Linux静态链接和动态链接浅析
- linux 静态动态链接库的编写和使用
- LINUX_C静态动态链接库
- Linux入门学习-gcc编译器与静态动态链接_第五章
- so-a--linux---静态--动态--链接库
- linux简单实现静态链接和动态链接
- Linux 静态与动态链接库
- gcc编译生成静态及动态链接库步骤
- Linux下的lds链接脚本简介(一)
- gcc编译生成静态及动态链接库步骤
- linux下c语言编程,动态链接和静态链接的理解
- Linux的nm查看动态和静态库中的符号
- Linux下的lds链接脚本简介(四)
- Linux下的动态链接库.so文件的使用
- Linux(gnu)环境动态链接库的搜索路径