编译过程概述和GCC命令-动静态链接库-1

101 阅读1分钟

编译过程概述和GCC命令

  • 预处理期
    主要进行预处理指令的替换 #include头文件和#define宏
    条件编译 #if #ifdef #ifndef
    经过预处理只剩下源代码
    GCC命令: gcc -E hello.c -o hello.i

  • 编译期
    主要进行语法分析 生成汇编指令
    删除注释 删除多余的空格 变成严格的代码格式
    int a; ==> int a;
    词法分析 将语句拆分成不可分割的单词
    int a; ==> int和a 将int和a分别存储在不同位置
    语法分析 验证语法规则 不同的编译器实现不同
    语义分析 语法正确但是语句表达的意思可能有问题
    if(a=3) 在C语言中衡为true 那么else语句块一定不会执行 这种情况会报一个warning
    GCC命令: gcc -S hello.i -o hello.s

  • 汇编期
    将代码从汇编代码转换成二进制文件
    经过编译期没有错误的情况下 将代码优化
    int a = 12;定义了a这个变量但是后续没有使用这个变量 那么就会将这条语句删除
    但也会产生指令重排序 多线程a++这种问题
    GCC命令: gcc -c hello.s -o hello.o

  • 链接期
    将系统提供的函数库和自己的代码链接到一起 生成可执行文件 多个obj文件 -> 可执行文件
    静态链接库就是这个时期链接到代码中 GCC命令: gcc -v hello.o -o hello

以上四个步骤按顺序执行后源代码变成可执行文件