chengdafeng 2010-06-25
Linux程序有两种形式,一种是executablefile,一种是scripts,分别对应windows下的exe程序和.bat,.com脚本,Linux不需要文件后缀名,是由FileSystemAttribute来确定一个文件是否是可执行的。
一般的程序在以下两个文件夹中:
/bin:系统程序
/usr/bin:用户的程序,包括常用的开发程序,如Gcc,Gdb,Python等等
头文件
一般头文件都在/usr/include中,当需要使用不在默认目录的头文件时,需要使用-I
如:$gcc-I/usr/openwin/includefred.c
此时编译器除了标准目录之外,在编译fred.c时还会查看/usr/openwin/include目录
Library文件
标准的库文件一般都在/lib和/usr/lib中,默认情况下连接器只会链接标准C的库文件(所以即使将库文件放在了标准目录中,如果它不属于标准C库函数,连接的时候需要指明)。
库文件的两种形式:.a静态库文件.so动态库文件
链接在标准目录中的非标准C库文件的两种方式:
$gcc-ofredfred.c/usr/lib/libm.a
$gcc-ofredfred.c-lm
使用后一种的好处是如果有动态的库文件,连接器会优先使用动态库文件进行连接
当要连接的库文件不在标准目录中时:
$gcc-ox11fred-L/usr/openwin/libx11fred.c-lX11
此时除了搜索标准目录,连接器还会搜索/usr/openwin/lib
静态库文件和动态库文件的区别
首先,静态库文件在连接的时候也仅仅只会链接该库文件中被程序用到的部分(其他部分并不包含,例如下面的例子中,program仅仅用到了bill.c中的函数,虽然libfoo.a中包含了fred.o和bill.o,但只有bill.o被链接倒program中)
但是当有多个程序用到该库中的某个函数时,该函数会被永久地链接到每个程序中,因此无论是在磁盘还是内存中(运行的时候)会有重复的拷贝。
而动态库文件(.so)则可以解决这一问题,.o文件被链接时,用到的库文件的函数并未被包含,而是仅仅只有一个引用,当程序运行时用到该函数才会被调入内存(因此也会导致一定的开销)。好处是动态库的更新并不会影响到程序(程序无须全部重新编译,例如Apache服务器中的许多模块都是动态的)
生成静态库文件
$gcc-cfred.c
$gcc-cbill.c//仅编译不连接
$ar-crvlibfoo.abill.ofred.o//生成库文件libfoo.a
$nmlibfoo.a//可以查看静态库文件中的模块
$ranliblibfoo.a//创建索引
使用静态库文件
创建一个lib.h文件,进行一下函数声明
voidbill(char*);
voidfred(int);
Program.c中包含lib.h头文件
$gcc-oprogramprogram.olibfoo.a
或者$gcc-oprogramprogram.o-L.-lfoo(-L.表示将当前目录加入当库文件的搜索区域内)
查看某个程序需要用到哪些动态库文件
$lddprogram
其中ld.so是用来进行动态加载的程序,是必需的,一般是/lib/ld-linux.so.*(版本号)
4externintadd(inta,intb);8inti=0;9printf("helloworld!\n");10printf("label_abc=%d\n",&&label_abc);11/