总结一下上周讲的库的编译流程。 linux下的库作用 对于编程人员就不必说了吧,linux下有两种库:动态库(共享库)和静态库
Q(OI]5E0 1.两者区别:51Testing软件测试网G7~o2k`)c&b7Y3R51Testing软件测试网|2ep/h4a5L:z5j2u
静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。51Testing软件测试网Z"xkB(}#]51Testing软件测试网#j,wAeIP!R
动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。不同的应用程序如果调用相同的库,那么在内存中只需要有一份该动态库(共享库)的实例。Z^ A*E5e@X$@h0
Yxx;c@&M*y0 静态库和共享库的最大区别,静态情况下,把库直接加载到程序中,而共享库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。51Testing软件测试网'B/eE8SG/g*n)v]r-o51Testing软件测试网/X|"i1G)WQ)_
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在51Testing软件测试网q4HZ RT;L
:[ H(bO*|ts4M:p0 2.静态库51Testing软件测试网Nk P*M:z
e8bhC51Testing软件测试网_9p]aafdjj&Mxd
2.1 基础概念与相关命令N9^;~+{;[D0pK051Testing软件测试网(r/Y3BF~"~g
a:库名格式lib.a,例如libmytest.ajW Crc*u0
d0I)jP*yB\0 b:ar命令创建静态库文件51Testing软件测试网3CD{/ti7v5D?Q#}
{4h_YE)h$xI0 d -----从指定的静态库文件中删除文件
9{i?/wH9z(q@0 m -----把文件移动到指定的静态库文件中51Testing软件测试网
l+Ye{.L/{3b+@
p -----把静态库文件中指定的文件输出到标准输出
I*H`IgpH-l0 q -----快速地把文件追加到静态库文件中51Testing软件测试网MMFZ"^q8O
r -----把文件插入到静态库文件中51Testing软件测试网vR4Yly'^)F
t -----显示静态库文件中文件的列表
4el.a;TU(KN0 x -----从静态库文件中提取文件51Testing软件测试网"Fxh3Uks(f3v
还有多个修饰符修改以上基本选项,详细请man ar 以下列出三个:51Testing软件测试网m7c6j3{.E+}E@
a -----把新的目标文件(*.o)添加到静态库文件中现有文件之后
3UC4F$SM9{q8pBO0 b -----***************************************之前51Testing软件测试网7ye`#\L6E'eD
v -----使用详细模式
6qoM W L3m#~0 ar 命令的命令行格式如下:
&C7iLD!h%a#i1I0 ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... 参数archive定义库的名称, files是库文件中包含的目标文件的清单, 用空格分隔每个文件
`ezAz;gKA%IB+c0 cc 参数cc -l把库做链接,静态库名称-L制定静态库路径51Testing软件测试网FuL]p3ZZ@
2.2 静态库制作及编译流程:51Testing软件测试网+m,L;i'j#It+zA
2.2.1.首先我们编写一个.c程序代码,内容如下:51Testing软件测试网V r"d s!_H&q~kkjl
//#include51Testing软件测试网T$Lat/a|,F51Testing软件测试网uEK9\9VZ8D
vl
int test(void){
_%dGdvo7V#h0 printf(" xiaolin hello");51Testing软件测试网_`GkSGn51Testing软件测试网i`!a ~H)t)S"b
}51Testing软件测试网S:I\-r0BX/@
%]1ndr5}p0o0 2.2.2.编译test.c生成test.o文件4p%C,z5H"S1N8o
mq051Testing软件测试网7|G4vU4_9PT
cc test.c -c51Testing软件测试网G5IOU^"CGWrOu
Fn-HkQm6Td0 执行完成之后会生成一个test.o的二进制文件Op(\ K/R.VN ~0
{M"ah'W;K@kh0 2.2.3.把.o文件打成.a静态库文件51Testing软件测试网/MZU/\2@V%\
^Hrrl-Jn0 ar crs libmytest.a test.o#pl&]g^ B%d051Testing软件测试网&IqXa"{
?L?
ar操作可以跟多个.o文件,需要空格,一起打成 mytest,使用ar -t libmytest.a 显示库包含的.o文件f2qhNMB4T&f0
X!|T
FtX7|w`.Y0 2.2.4.进行静态库编译并执行`9d-s.Bk0
l*M2fs3dro&w0 编写一个man.c程序代码,内容如下:n5@*fqXZM051Testing软件测试网&_i{9p@"TAT-C
int main(int argc,char **argv){d@5DtBf0z}9~hI051Testing软件测试网;`g$q+p1w*F7l6T-h
printftest();}-GL-tdP^0f+?4]051Testing软件测试网c4dK1ZV5P+P%et]
编译main.c加载静态库51Testing软件测试网4D,c4K!o$A_S`q
qC`6Xe#g2HE0 cc main.c -lmytest -L.h;RT#QNGK0
8K@0y7_?%a0-l静态库名称 -L静态库路径 .指当前目录2{#x`&CN1G't;v051Testing软件测试网[A+f1Wn?1?c
编译完成执行./a.out输出xiaolin hello5IKRNr#`*z0
zdxU@aM%b03.动态库(共享库so)51Testing软件测试网a6y\8XI2v$?8Tu51Testing软件测试网_s]9_$Y{K9u `
51Testing软件测试网E6O"XY)q(ky%p51Testing软件测试网eZ1nqA4W
3.1 基础概念与相关命令51Testing软件测试网;BdEX@_-E!B51Testing软件测试网[LAc2l:X%M+}4w
a:库名格式lib.so,例如libmyshare.so51Testing软件测试网XLsvj&H,N