学习笔记 《鸟哥的私房菜——软件安装:源码和Tarball》

文章原文:

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里面

 

posted @ 2012-02-09 23:22 lengyuhong 阅读(...) 评论(...) 编辑 收藏