文章原文:
http://linux-vbird.bluedata.org/linux_base/0520source_code_and_tarball.htm#library_dyna_sta
重点学习内容:
一、 源码的编译:
特别注意-l 和-L两个参数,在使用到外部函数库时是非常重要的。
[guest@test guest]# gcc sin.c -lm -L/lib -L/usr/lib
# 特别注意,那个 -lm 可以拆开成两部份来看,
# -l 是『加入某个函式库(library)』的意思,而m 则是 libm.so 这个函式库,其中, lib 与附档名(.a 或 .so)不需要写
# 所以 -lm 表示使用 libm.so (或 libm.a) 这个函式库的意思~ ,这个语句可以写多次,比如
# 至于那个 -L 后面接的路径呢?这表示:
#『我要的函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻!』
[guest@test guest]# ./a.out
1.000000
补充:
头文件:g++ 时,默认的头文件都存在/usr/include,基本上大部分unix和linux都是这样的,可以用gcc -I/usr/myinclude 来设置自己的包含路径
二、动态和静态函数库:
静态函数库 | 动态函数库 | |
扩展名 |
通常为libXXX.a |
通常为libXXX.so |
编译行为 |
这类函数库在编译的时候会直接整合到执行程序当中, 所以利用静态函数库编译成的文件会比较大一点 |
动态函数库在编译的时候,在程序里面只有一个“指向”(Pointer,我的理解就个指针) 的位置而已。也就是说,动态函数的内容并没有整合到可执行的文件当中,而是当可执行 文件要使用到函数库的机制时,程序才去读取函数库来使用。由于可执行文件仅具有执行 动态函数库所在的指针而已,并不包含函数库的内容。所以它的文件会小一点 |
独立执行的状态 |
它最大的优点,编译成功的可执行文件可以独立执行, 而不需要再向外部要求读取函数库的内容 |
这类型的函数库所编译出来的程序不能独立执行,因为当我们使用到函数库时,程序才会去 读取函数库,所以函数库文件必须存在才行,而且函数库的所在目录也不能改变,因为我们 的可执行文件里面仅有“指标”,亦即当要取用该动态函数库时,程序会主动去某个路径下读取, 所以动态函数库可不能随意移动或删除,会影响到很多相关的程序 |
升级难易度 |
虽然可执行文件可以单独执行,但因为函数库时直接整合到 可执行文件,因此若函数库升级时,整个可执行必须要重新 编译才能将新版的函数库整合到程序当中,也就是说,在升 级方面,只要函数库升级了,所有将此函数库纳入的程序都 必须重新编译 |
当函数库升级后,可执行文件根本不需要进行重新编译的行为,因为可执行文件会直接指向 新的函数库文件(前提是函数库新旧版本的文件名相同) |
目前Linux distribution比较倾向于使用动态库,处于的考虑是升级的方便。
绝大多数的函数库防止在/usr/bin,/lib目录下,此外,linux系统里面的函数其实kernel就提供了,它放在/lib/modules里面