分类: LINUX
2013-08-22 20:48:51
1、gcc编译过程
1、预处理(一般包含头文件、宏替换、条件编译)
包含头文件:一些头文件,在这里只是一些函数申明,如stdio.h 并没有调用库函数,真正调用库函数是在最后一步,链接阶段。
宏替换:宏定义可以有分号且可以是函数。如:#define Max(a,b)((a)>(b)?(a):(b));这种宏定义是正确的。
条件编译:这是一些防重复包含的东西。如(#ifndef
#define)
如果函数名为/*hello*/ 则防重复包含的格式为#ifndef _HELLO_H_
#define _HELLO_H_
防重复包含顾名思义就是防止一些命令等的重复使用包含,在写一些大的程序是很容易会重复包含的,如一些函数的嵌套调用
就不得不用防重复包含了.
其实此过程处理的是一些带#的东西
2、编译
此过程是检查一些语法错误的,并转换成汇编代码。
3、汇编
汇编是将汇编代码转换成不可执行的二进制代码
4、链接
成功调用库函数,最终来生成可执行文件。
静态函数库:
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,
他的优点就显而易见了, 即编译后的执行程序不需要外部的函数库支持,而且程序执行的速度较快,因为所有使用的函数都已经被编译进去了。
当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必 须重新编译。很不便于维护。
动态函数库:
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,
你的程序执行到相关函数时才调用该函数 库里的相应函数,因此动态函数库所产生的可执行文件比较小。
由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序执行速度较慢。而且程序的运行环境中必须 提供相应的库来支持程序的执行。
动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。也就是便于维护。