a> 预编译:处理所有的注释,以空格代替;将所有的 #define 删除并且展开所有的宏定义;处理条件编译指令 #if, #ifdef, #elif, #else, #endif;处理 #include,展开被包含的文件;保留编译器需要使用的 #pragma 指令。预处理指令示例:gcc -E file.c -o file.i
b> 编译:对预处理文件进行词法分析、语法分析以及语义分析;在分析结束后进行代码优化并生成相应的汇编代码文件。词法分析是指分析关键字,标识符及立即数等是否合法;语法分析是指分析表达式是否遵循语法规则;语义分析是指在语法分析的基础上进一步的分析表达式是否合法。编译指令示例:gcc -S file.i -o file.s
c> 汇编:汇编器将汇编代码转变为机器可以执行的指令,每条指令语句几乎都对应一条机器指令。汇编指令示例:gcc -c file.s -o file.o
总得来说编译过程分为预处理、编译、汇编和链接四个阶段,预处理就是处理注释,宏以及已经以 # 开头的符号;编译就是进行词法分析、语法分析以及语义分析;汇编就是将汇编代码翻译为机器指令的目标文件。
那么链接器的作用主要是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。它分为静态链接和动态链接两种。
a> 静态链接:指由链接器在链接时将库的内容直接加入到可执行程序中。关系如下
Linux 下静态库的创建和使用:1、编译静态库源码:gcc -c lib.c -o lib.o;2、生成静态库文件:ar -q lib.a lib.o;3、使用静态库编译:gcc main.c lib.a -o main.out
b> 动态链接: 可执行程序在运行时才动态加载库进行链接,库的内容不会进入可执行程序当中。关系如下
Linux 下动态库的创建和使用:1、编译动态库源码:gcc -shared dlib.c -o dlib.so;2、使用动态库编译:gcc main.c ldl -o main.out;3、关键系统调用:dlopen:打开动态库文件,dlsym:查找动态库中的函数并返回调用地址,dlclose:关闭动态库文件。
总得来说,链接是指将目标文件最终链接为可执行程序。根据链接方式的不同,链接过程可分为:静态链接,将目标文件直接链接进可执行程序;动态链接,在程序启动后才动态加载目标文件。后面我们会继续对 C 语言的学习。
欢迎大家一起来学习 C 语言,可以加我QQ:243343083。
原文地址:http://blog.51cto.com/12810168/2097189