本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。所谓静态、动态是指链接。
之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
动态库同理。
静态库特点总结如下:
静态库对函数库的链接是放在编译时期完成的。
程序在运行时与函数库再无瓜葛,移植方便。
浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
动态库特点总结如下:
动态库把对一些库函数的链接载入推迟到程序运行的时期。
可以实现进程之间的资源共享。(因此动态库也称为共享库)将一些程序升级变得简单。
甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
1.编译成静态库
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序test.c通过gcc先编译成.o文件。用Makefile也可实现。
创建库名libqww.a的库,使用命令ar,库名称为qww
ar rcs libqww.a 1.o 2.o 3.o 4.o 5.o
创建库文件的接口文件头文件
gcc -o testqww test.c -static -L. -lcal
(1)、gcc -o testqww:使用gcc编译,-o指定文件名,后边的testqww就是最终生成的文件名
(2)、-static:指明使用静态库
(3)、-L.:-L指明使用库,后面的.表明库文件在当前目录
(4)、-lcal:表明是库文件的名称,其中-表明是选项,l是lib的简写,后边的cal才是真正的库文件名称,后缀名是不需要的
2.编译成动态库
生成目标文件1.o 2.o 3.o 4.o 5.o test.o
Gcc编译也好 make也行
gcc -shared -fPIC -o libqww.so 1.o 2.o 3.o 4.o 5.o
其中上边命令的说明:
(1)、gcc -o libqww.so:使用gcc编译,-o指定文件名,后边的libqww.so就是最终生成的动态库名,到后面就是libqww.a.
(2)、-shared:指明生成动态库
(3)、-fPIC.:该选项告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用,运行时进行地址链接
gcc -o test test.c -L. -lqww
其中上边命令的说明:
(1)、gcc -o test:使用gcc编译,-o指定文件名.
(2)、没有使用-static:指明使用动态库
(3)、-L.:-L指明使用库,后面的.表明库文件在当前目录
(4)、-lqww:表明是库文件的名称,其中-表明是选项,l是lib的简写,后边qww才是真正的库文件名称,后缀名是不需要的
查看文件大小:
total 84
-rw-rw-rw- 1 qiuww qiuww 117 Mar 19 20:07 1.c
-rw-rw-rw- 1 qiuww qiuww 1232 Mar 20 20:16 1.o
-rw-rw-rw- 1 qiuww qiuww 107 Mar 19 20:08 2.c
-rw-rw-rw- 1 qiuww qiuww 1232 Mar 20 20:16 2.o
-rw-rw-rw- 1 qiuww qiuww 111 Mar 19 20:08 3.c
-rw-rw-rw- 1 qiuww qiuww 1232 Mar 20 20:16 3.o
-rw-rw-rw- 1 qiuww qiuww 180 Mar 19 20:08 4.c
-rw-rw-rw- 1 qiuww qiuww 1248 Mar 20 20:16 4.o
-rw-rw-rw- 1 qiuww qiuww 107 Mar 19 20:48 5.c
-rw-rw-rw- 1 qiuww qiuww 1232 Mar 20 20:16 5.o
---------- 1 qiuww qiuww 362 Mar 20 20:16 Makefile
-rwxrwxrwx 1 qiuww qiuww 8680 Mar 22 09:55 a.out
-rwxrwxrwx 1 qiuww qiuww 8681 Mar 20 20:36 bol
-rw-rw-rw- 1 qiuww qiuww 216 Mar 19 20:22 cal.h
-rw-rw-rw- 1 qiuww qiuww 6588 Mar 20 20:21 libqww.a
-rwxrwxrwx 1 qiuww qiuww 7657 Mar 20 20:42 qww.so
-rw-rw-rw- 1 qiuww qiuww 586 Mar 20 20:17 test.c
-rw-rw-rw- 1 qiuww qiuww 2736 Mar 20 20:18 test.o
-rwxrwxrwx 1 qiuww qiuww 8681 Mar 20 20:42 testqww
原先静态库是十分巨大的足有700K左右,但后面实现了动态库,不知怎么了静态库变小了。
动态库比之前的静态库小的多。
本文摘自 叕叒双又的 linux下库文件的编程 https://www.cnblogs.com/guochaoxxl/p/7141447.html