linux下的动态库

来源:互联网 发布:国际象棋棋谱制作软件 编辑:程序博客网 时间:2024/04/29 12:01

1. 类型

虽然linux下文件的类型是不依赖于其后缀名的,但一般来讲: 

.o,是目标文件,相当于windows中的.obj文件 
.so 为共享库,是shared object,用于动态连接的,相当于windows中的.dll 
.a为静态库,是.o文件的集合,用于静态连接 

.la为libtool自动生成的一些共享库,主要记录了一些配置信息。

2. 说明

A:静态库(.a)

较适宜于较小的应用程序,它实际上就是简单的一个普通的目标文件(.o)的集合,一般来说习惯用“.a”作为文件的后缀。可以用ar这个程序来产生静态函数库文件。静态函数库现在已经不在像以前用得那么多了,不过,在一些场所静态函数库仍然在使用,一来是保持一些与以前某些程序的兼容,二来它描述起来也比较简单。 
静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,计算机处理速度不断提高,静态库优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就 可以给别人提供一个静态函数库文件。理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数 库)的程序运行速度上快一些,大概1-5%。 
创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码,可以用下面的命令: 
ar rcs my_library.a file1.o file2.o 
这 个例子中是把目标代码file1.o和file2.o加入到my_library.a这个函数库文件中,如果my_library.a不存在 则创建一个新的文件。
B:共享函数库 (.so)

而对于需要多个库的应用程序来说,则适合使用共享库,因为 它们可以减少应用程序对内存(包括运行时中的磁盘占用和内存占用)的占用。这是因为多个应用程序可以同时使用一个共享库;因此,每次只需要在内存上复制一 个库。要是静态库的话,每一个运行的程序都要有一份库的副本。

linux连接.so文件有两种方式:todo

适用ldd命令来查看程序使用了那些动态库(ldd 可执行文件)

动态库用 nm 命令生成

3. 常见问题

A:运行程序的时候找不到依赖的so (假设.so文件在/tmp下)

可以修改LD_LIBRARY_PATH这个环境变量

 export LD_LIBRARY_PATH=/tmp

不过这样export 只对当前shell有效,当另开一个shell时候,又要重新设置。把export LD_LIBRARY_PATH=/tmp 语句写到 ~/.bashrc中,这样就对当前用户有效了,写到/etc/bashrc中就对所有用户有效了。