C语言如何制作库文件
库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。标准库的存放位置为/lib/或者usr/lib目录中。
库文件的命名:总是以lib开头,随后的部分指明是什么库,例如libc是c库,libm是数学库等。文件名的最后部分以.开始,然后给出库文件的类型:
.a:表示传统的静态函数库
.so:代表共享函数库
这条命令要求编译文件fred.c,将编译产生的文件名命名为fred,并且除了搜索标准的C语言函数库外,还要搜索数学库libm.a解决函数引用问题。虽然函数库文件存放在标准的路径之下,但是也可以使用-L为编译器指明需要增加的函数库搜索路径。
这条命令用/usr/openwin/lib目录中的libx11库来编译和链接程序x11fred.
即:
上文所说的-lx11,指的就是需要依赖libx11库。使用-l(小写L)的形式的好处是:如果动态库存在的情况下,会优先使用动态库。
静态库:
静态库也称为归档文件:archive,按照惯例这种类型的文件都以.a结尾。
创建静态库文件分三步:
1、分别创建为每一个函数创建一个源文件。
2、使用gcc -c 命令将源文件编译成为.o文件,因为此时的两个源文件并不能组成程序。
3、检查两个源文件准确无误后,使用下列命令对其进行打包:
xxx.o表示需要打包的.o文件,可以是多个。
4、为库文件生成内容表
这样,库文件就能正常使用了。
静态库的缺点:
多个运行中的应用程序同事使用同一个函数库的函数时,内存中就会存在同一函数的多个副本,而且在程序文件自身中也同时存在多份同样的副本,这将消耗大量宝贵的内存和磁盘空间。
共享库
共享库的保存位置与静态库是一样的,但共享库有不同的文件名后缀。当一个程序使用共享库时,他的链接方式是这样的:
程序本身不再包含函数代码,而是引用运行时可访问的共享代码。当编译好的程序被装载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要,共享库才会被加载到内存中。
通过这种方式,系统可以只保留共享库的一份副本供许多应用程序同时使用,并且在磁盘上也保留一份,另一份的好处是共享库的更新可以独立于依赖他的应用程序。