第6课-函数库设计
1.Linux下的应用程序所需要的外部函数可以由函数可和系统调用提供。
2.函数库是处于用户态的,由工作人员编写的函数的集合,而系统调用是由Linux内核实现的。
3.函数库分为静态和动态,按照链接方式划分的。动态函数库比静态节约空间。使用静态函数库以后应用程序最终会包含自身和函数库,在内存中运行的时候就会有多个函数可的拷贝,导致在空间上的浪费。而动态函数库则在内存中只有一个拷贝,供多个都会使用到的程序使用。
4.Linux使用的函数库一般都是在/lib或者在/usr/lib,以*.so*命名的,是动态函数库,以*.a命名的是静态函数库。
5.Linux进行链接默认使用动态函数库,要使用静态函数库,必须显示指明-static选项。
6.可以使用readelf -d 命令查看程序所使用的函数库。
7.-l表示查找某一个库,如-lc是查找c库,而静态c库一般都以libc.a命名。
8. 有些Linux发行版默认不提供某些静态库。
9.制作静态函数库
(1)编写好你要制作库的函数,写在.c文件
(2)编译.c文件,使用-c选项,只编译不链接,生成中间.o文件
(3)使用ar命令将中间.o文件打包成库文件(.a)
(4)将生成的库文件复制到/usr/lib目录下
(5)要使用自己的库函数,在编译的时候要显示的指明,用-l(name)选项,Linux只使用c库。
10.库文件的命名:
libname.a
libname.so
11.动态函数库设计(共享库)。使用的时同样要显示指定引用的库。-lname选项、
我看完了 静态和动态函数库的设计 这部分的视频。有一点不明白。
我先说一下我的理解:
函数库分为动态和静态两种,更直观一点来说,在文件上分为.a和 .so 。
我现在写了一个函数——add.c,功能很简单,就是实现两个整形数据的加法。
这个函数我可以把它编译成动态函数库,也可以把它编译成静态函数库,分别命名为libmyadd.so和libmyadd.a.
我现在只想使用动态库函数,所以我将上面的libmyadd.so放到/usr/lib中。
我又写了一个文件——main.c,在该文件中将会调用上面的add功能。
在编译main.c时,
如果使用命令 gcc main.c -lmyadd -o test 进行编译,很显然,它会默认动态链接libmyadd.so,生成的目标文件test会很小。
如果使用命令 gcc -static main.c -lmyadd -o test 进行编译呢,动态库文件libmyadd.so能否以静态的方式编译进目标文件test中呢?
同理,我如果只把静态库文件libmyadd.a放入 /usr/lib中,但是编译时却使用默认的动态链接方式,是否能成功呢?
再者,我把上面的两个动态和静态库文件都放在/usr/lib中,那么,执行命令gcc main.c -lmyadd -o test 时,编译器默认会使用那个库文件呢?
加上static参数之后呢?
总之,对于动态链接、静态链接、动态库文件、静态库文件 之间的对应关系不是很明白。