摘要

gcc、g++、预处理、编译、汇编、链接、动态库、静态库

介绍

gcc hello.c
包含4个过程,默认输出为a.out

预处理

将C源代码中的包含的头文件如stdio.h添加进来

编译

检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言
gcc –S hello.i –o hello.s

汇编

把编译阶段生成的”.s”文件转成二进制目标代码“.o”文件
gcc –c hello.s –o hello.o

链接

gcc hello.o –o hello

过程

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接

保存所有中间文件:-save-temps

1. 预处理/预编译 Pre-processing

生成.i、.ii文件

  1. 文件包含#include
    1. 优先查找 #include “” ,若成功则遮蔽 #include <> 同名文件
    2. 递归
    3. 文件内容全部拷贝
  2. 宏替换#define
  3. 条件编译#ifndef
    1. if、#ifndef、#ifdef、#endif、#undef

    2. 版本控制、防止文件重复包含
  4. 布局控制 #pragma
    1. 设定编译器状态
    2. 指示编译器完成特定动作
  5. 删注释
  6. 添加行号、文件标识符——显示调试信息
  7. 预定义符号
    1. FILE 源文件名
    2. LINE 当前行号
    3. DATETIME 文件被编译日期、时间
    4. STDC

引入头文件include
宏替换define

生成:gcc -E XXX.c XXX.i
查看:cat XXX.i

2. 编译 Compiling

生成.s、.S文件
纠错

3. 汇编 Assembling

生成目标文件.o,即二进制文件
不同平台不一样

4. 链接 Link

生成可执行文件
符号重定向:合并多个.o文件
链接动静态库

链接库

静态库

动态库

参考

  1. https://blog.csdn.net/Three_dog/article/details/103688043 /https://app.yinxiang.com/shard/s62/nl/20661438/19606c36-2d80-4924-8b7a-2c4f087f7188
  2. c++程序编译过程 - 知乎 (zhihu.com)