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