库技术 - Linux 库详解(12 页)Good is good, but better carries it.精益求精,善益求善。Linux 库详解1 库基本概念1.1 库的分类 有两种说法,假如熟悉 WIN 平台下的 DLL,信任不难理解: 库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时, 只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开 始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。 Linux 下的库文件分为共享库和静态库两大类,它们两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。区分库类型最好的方法是看它们的文件后缀,通常共享库以.so(Shared Object 的缩写)结尾,静态链接库通常以.a 结尾(Archive 的缩写)。在终端缺省情况下,共享库通常为绿色,而静态库为黑色。 已经开发的大多数库都实行共享库的方式。ELF 格式的可执行文件使得共享库能够比较容易地实现,当然使用旧的 a.out 模式也可以实现库的共享。Linux 系统中目前可执行文件 的标准格式为 ELF 格式 。 .a 的是为了支持较老的 a.out 格式的可执行文件的 .so 的是支持 elf 格式的可执行文件的库。 .a 是静态库文件,可以用 ar 命令生成。 .so 是动态库文件,编译时加上指定的选项即可生成,具体选项看相应的系统文档了。1.2 库的命名规则GNU 库的使用必须遵守 Library GNU Public License(LGPL 许可协议)。该协议与 GNU 许可协议略有不同,开发人员可以免费使用 GNU 库进行软件开发,但必须保证向用户提供所用的库函数的源代码。库的命名和约定:(1)所以的库都以 lib 开头,许多开发工具都依赖这个约定,特别是 GCC,它会在-l 选项所指定的文件名前自动地插入 lib. (2)文件名以.a(代表存档,archive)结尾的库都是静态库,文件名以.so(代表共享目标文件,shared object)结尾的库都是共享库,例如,libdl.a 是一个静态库,而 libc.so 是一个共享库。采纳旧的 a.out 格式的共享库的后缀名为.sa。(3) 以_g 和_p ...