C语言_静态库的制作和使用

一、什么是库

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。

Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。Linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

静态库和共享库的概念

在链接共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真正的做链接,可执行文件中仍然是未定义的符号,需要在运行时做动态链接。

而在链接静态库时,链接器会把静态库中的目标文件取出来和可执行文件真正的链接在一起,所以采用静态库的可执行文件一般很大,不需要库文件也能运行,而采用共享库的可执行文件一般比较小,需要库文件才能运行。

静态库可以认为是一些目标代码的集合,按照习惯,一般以“.a”作为文件后缀名。使用 ar (archiver)命令可以创建静态库。 因为共享库有着更大的优势,静态库已经不经常使用了。但是由于静态库使用简单,效率相对动态库较高一点,所有仍有用武之地。但是在有些Unix系统中 例如 “Solaris 10”已经基本废弃了静态库了。

静态库在应用程序生成时,可以不必编译,节省编译时间,但在编译齐愈来愈快的今天,这一点四核已经不重要了。如果其他的开发人员要使用你的程序,而你又不想给其源码,提供给静态库是一种选择。

从理论上件,应用程序使用了静态库,要比使用动态加载库速度快 1 -5%左右,但是实际上可能并非如此。所有由此看来除了使用方便外没静态库可能并非一种好的选择(这是题外话,个人比较推荐使用动态库的

下面就来说说 静态库的制作

1.要创建一个静态库,或者要将目标代码加入到已经存在的静态库中,可以使用以下命令:

ar rcs libmylib.a zploofile.o zploofile2.o
这段shell命令表示:

1 . 把gcc编程生成的 “.o”目标文件 zploofile1.o 和 zploofile2.o 这两个文件加入到静态库 libmylib.a 中 (ar的参数 r)。

2 . 如果libmylib.a这个文件不存在,就会自动创建一个 (ar的参数 c) 。

3 . 然后更新 .a 文件的索引,使之包含新加入的 .o 文件的内容(ar 的参数 s)。

2.静态库创建成功后,需要链接到应用程序中使用。

使用gcc的 -l 参数来指定静态库,使用 -L 参数来指定库文件的搜索路径。

对于 -l 参数的静态库的名字需要说明的是,所有的库文件都是以 lib开头 .a结尾的 所有在-l参数 不需要写 libmylib.a 就写一个 mylib 就可以了

-l 和 -L 之后 和 其参数 之间有没有空格都可以,这个无所谓

3.在使用gcc时,要注意其参数的顺序。-l 是链接器选项,一定要放在被编译的文件名称之后。如果放在文件名称之前则会导致 链接失败 ,并且还会出现一些莫名其妙的错误(经验之谈),请大家切记这一点

如何链接使用静态库

#使用libmylib.a 这个静态库 编译zploo.c这个源文件
gcc -static –Wall –L./ –I./ –lmylib -o zploo zploo.c

-static 参数代表 编译时使用使用静态库

-L./ 表示共享库有可能在当前目录下,

-I./  表示头文件目录有可能在当前目录下,

-lmylib 表示静态库的名字为libname.a,静态链接是将库文件和目标文件链接在一起的,所以在平台上不需要库文件就可以直接运行

-o zploo 表示将编译后生成的可执行文件重名为 zploo

暂无评论

发表评论