UNIX/Linux学习笔记(2)GNU编译器
引言:小编上回写了一点有关Linux和UNIX的基础概念,今天来讲讲运行程序前的一些重要步骤都是为了什么
预处理,编译,汇编,链接的概念和区别
①预处理:
1)预处理指令:以#
开头,常常是头文件的声明和宏定义
2)程序猿所编写的代码并不是计算机所能直接识别的标准C代码,预处理所进行的工作便是将预处理指令指定的文本进行替换,宏进行展开,注释进行删除,使代码标准化
3)
#include <stdio.h>
#include "math_my.h"
在进行文本替换时会根据< >
" "
从不同的路径加载头文件
< >
:从系统指定的目录下加载头文件
" "
:先从当前目录下加载头文件,若未找到,再从系统指定的目录下加载头文件
注意:系统通过设置环境变量指定加载文件的路径
4)预处理往往不会进行任何语法检查,语法检查是编译器需要做的事情
5)预处理指令(来自小编的OneNote,实在用不惯马克的表格)
②编译:
1)将预处理得到的标准代码翻译成汇编代码(高级语言 → 汇编语言)
③汇编:
1)将编译后的汇编语言翻译成机器语言指令,并将结果保存在目标文件中(汇编语言 → 机器语言)
2)目标文件是二进制文件,无法直接用文本编辑器打开查看
3)源程序翻译成目标程序的工作有5大阶段:词法分析、语法分析、语义检查和中间代码生成、代码优化、目标代码生成。词法和语法分析又称为源程序分析,若发现语法错误,则会给出提示信息
④链接:
1)若干个目标文件合并成一个可执行文件
2)函数库的链接,函数库又分为动态库与静态库,小编将在下一篇博客好好聊一聊函数库,所以这里先不赘述了
文件后缀
命令行的特殊参数
#include <stdio.h>
int main()
{
printf("hello world! %d",pi);
}
gcc -D pi=3 test1.c
总结
有关链接的函数库内容,小编将在下一篇博客中详细介绍,希望和我一样的萌新看了这篇博客之后能去虚拟机上试试不同的命令,并看看生成的文件后缀是否符合