1.静态库和共享库的概念
在链接共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真正的做链接,可执行文件中仍然是未定义的符号,需要在运行时做动态链接。而在链接静态库时,链接器会把静态库中的目标文件取出来和可执行文件真正的链接在一起,所以采用静态库的可执行文件一般很大,不需要库文件也能运行,而采用共享库的可执行文件一般比较小,需要库文件才能运行。
2.如何制作静态库和共享库
(1)静态库制作
首先将源文件编译成目标文件,制作静态库采用打包命令ar即可,例如:ar rs libname.a a.o b.o c.o,r表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包已有同名文件就替换成新的,s是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。ranlib命令也可以为静态库创建索引,以上命令等价于:
ar r libname.a a.ob.o c.o
ranlib libname.a
(2)动态库制作
组成共享库的目标文件和一般的目标文件有所不同,在编译时要加上-fPIC选项,表示生成与位置无关代码。采用gcc将目标文件链接成共享库,例如:
gcc –shared –olibname a.o b.o c.o
-shared专门用于生成共享库的
3.应用程序怎么编译,怎么链接
编译器会首先找有没有共享库.so,如果有就链接它,如果没有就找有没有静态库,如果有就链接,所以编译器优先考虑共享库,如果希望编译器只链接静态库,编译时加上-static选项。
gcc –Wall –L. –I. –lname–o hello hello.c
-L.表示共享库有可能在当前目录下,-I.表示头文件目录有可能在当前目录下,-lname表示共享库的名字为libname.so,或者静态库的名字为libname.a,静态链接是将库文件和目标文件链接在一起的,所以在平台上不需要库文件就可以直接运行,而动态链接的还需要将共享库拷贝到/usr/lib/下面,这样应用程序才能执行。