C/C++

2023-10-27


摘自: 麦子学院-C语言程序设计及快速入门

C语言的预处理及编译过程分析

gcc -v -o build 1.c

输出内容

C:\Users\Vera\Desktop>gcc -v -o build 1.c
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../build/gcc/src/configure --target=x86_64-w64-mingw32 --prefix=/c/bb/vista64-mingw32/mingw-x86-x86_64/build/build/root --with-sysroot=/c/bb/vista64-mingw32/mingw-x86-x86_64/build/build/root --enable-languages=all,obj-c++ --enable-fully-dynamic-string --disable-multilib
Thread model: win32
gcc version 4.7.0 20111220 (experimental) (GCC)
COLLECT_GCC_OPTIONS='-v' '-o' 'build.exe' '-mtune=generic' '-march=x86-64'
 f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.0/cc1.exe -quiet -v -iprefix f:\anaconda3\pkgs\mingw-4.7-1\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.0/ -U_REENTRANT 1.c -quiet -dumpbase 1.c -mtune=generic -march=x86-64 -auxbase 1 -version -o C:\Users\Vera\AppData\Local\Temp\ccRFZVtk.s
GNU C (GCC) version 4.7.0 20111220 (experimental) (x86_64-w64-mingw32)
        compiled by GNU C version 4.5.2, GMP version 5.0.1, MPFR version 2.4.2, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
ignoring duplicate directory "f:/anaconda3/pkgs/mingw-4.7-1/mingw/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/4.7.0/include"
ignoring nonexistent directory "c:/bb/vista64-mingw32/mingw-x86-x86_64/build/build/rootc:/bb/vista64-mingw32/mingw-x86-x86_64/build/build/root/lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../include"
ignoring duplicate directory "f:/anaconda3/pkgs/mingw-4.7-1/mingw/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/4.7.0/include-fixed"
ignoring duplicate directory "f:/anaconda3/pkgs/mingw-4.7-1/mingw/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include"
ignoring nonexistent directory "c:/bb/vista64-mingw32/mingw-x86-x86_64/build/build/rootc:/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 f:\anaconda3\pkgs\mingw-4.7-1\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.0/include
 f:\anaconda3\pkgs\mingw-4.7-1\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.0/include-fixed
 f:\anaconda3\pkgs\mingw-4.7-1\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include
End of search list.
GNU C (GCC) version 4.7.0 20111220 (experimental) (x86_64-w64-mingw32)
        compiled by GNU C version 4.5.2, GMP version 5.0.1, MPFR version 2.4.2, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: 6dafe883c1f59de430b201ea1dfaaae8
COLLECT_GCC_OPTIONS='-v' '-o' 'build.exe' '-mtune=generic' '-march=x86-64'
 f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/bin/as.exe -o C:\Users\Vera\AppData\Local\Temp\ccaZqlwM.o C:\Users\Vera\AppData\Local\Temp\ccRFZVtk.s
COMPILER_PATH=f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.0/;f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../libexec/gcc/;f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/bin/
LIBRARY_PATH=f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/;f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/;f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib/../lib/;f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'build.exe' '-mtune=generic' '-march=x86-64'
 f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.0/collect2.exe --sysroot=c:/bb/vista64-mingw32/mingw-x86-x86_64/build/build/root -m i386pep -Bdynamic -o build.exe f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib/../lib/crtbegin.o -Lf:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0 -Lf:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc -Lf:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib/../lib -Lf:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib C:\Users\Vera\AppData\Local\Temp\ccaZqlwM.o -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/lib/../lib/crtend.o

主要步骤

预处理(相当于替换)

cpp -o build.i 1.c 相当于gcc -E -o build.i 1.c

示例

修改1.c,加入define:

C:\Users\Vera\Desktop>type 1.c
#include <stdio.h>
#define POLICE  110
int main()
{
    int a =POLICE;
    printf("hello world! 你好\n");
    return 0;
}

C:\Users\Vera\Desktop>gcc -E -o build.i 1.c
显示build.i的内容

C:\Users\Vera\Desktop>type build.i

输出值:

# 1 "1.c"
# 1 "<command-line>"
# 1 "1.c"
# 1 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/stdio.h" 1 3
# 9 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/stdio.h" 3
# 1 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw.h" 1 3
# 10 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw.h" 3
# 1 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw_mac.h" 1 3
# 32 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw_mac.h" 3

# 41 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw_mac.h" 3

# 11 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw.h" 2 3
# 293 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw.h" 3
# 1 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/vadefs.h" 1 3
# 13 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/vadefs.h" 3
# 1 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw.h" 1 3
# 739 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/_mingw.h" 3
# 1 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/sdks/_mingw_directx.h" 1 3
......
# 1025 "f:\\anaconda3\\pkgs\\mingw-4.7-1\\mingw\\bin\\../lib/gcc/x86_64-w64-mingw32/4.7.0/../../../../x86_64-w64-mingw32/include/stdio.h" 2 3
# 2 "1.c" 2

int main()
{
    int a =110;
    printf("hello world! 你好\n");
    return 0;
}

1、主程序体以上的输出内容是预编译时加入的头文件部分,编译器自动加入;
2、可以看到宏名POLICE已经被110替换了。define,include均在本阶段被执行了,所以本质上将它们都不是关键字(关键字应该由编译器处理)。

编译

第一条调用的命令:f:/anaconda3/pkgs/mingw-4.7-1/mingw/bin/…/libexec/gcc/x86_64-w64-mingw32/4.7.0/cc1.exe … 1.c…-o \ccRFZVtk.s**

cc1.exe称作编译器,相当于gcc -S 1.c ccRFZVtk.s

汇编(让cpu认识代码)

第2条调用的命令:x86_64-w64-mingw32/bin/as.exe …-o \ccaZqlwM.o…\ccRFZVtk.s

上一步的输出文件ccRFZVtk.s作为本次的输入文件,执行as.exe后输出\ccaZqlwM.o文件。
as.exe执行的操作,相当于gcc -c,即先执行编译,再执行汇编,因为不能直接汇编1.c,即-c选项直接生成.o。

链接器(链接系统标准库)

第3条调用的命令:/x86_64-w64-mingw32/4.7.0/collect2.exe -o build.exe 多个.o文件

collect2.exe的操作,相当于gcc -o,已包含了-S,-c的操作。

示例

C:\Users\Vera\Desktop>gcc -S -o build.s 1.c

C:\Users\Vera\Desktop>dir/w
驱动器 C 中的卷是 OS
卷的序列号是 70C8-B66E

C:\Users\Vera\Desktop 的目录

[.] […] 1.c build.s

C:\Users\Vera\Desktop>notepad build.s
这里生成的是x86的汇编代码:

C:\Users\Vera\Desktop>gcc -c -o build.o build.s

C:\Users\Vera\Desktop>dir/w
驱动器 C 中的卷是 OS
卷的序列号是 70C8-B66E

C:\Users\Vera\Desktop 的目录

[.] […] 1.c build.o build.s

C:\Users\Vera\Desktop>notepad build.o
这里生成二进制代码。
C:\Users\Vera\Desktop>gcc -o build 1.c

C:\Users\Vera\Desktop>dir/w
驱动器 C 中的卷是 OS
卷的序列号是 70C8-B66E

C:\Users\Vera\Desktop 的目录

[.] […] 1.c build.exe build.o build.s

C:\Users\Vera\Desktop>build
hello world! 你好

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 的相关文章

随机推荐

  • Python爬虫之JS逆向分析技巧

    Python爬虫之JS逆向分析技巧 当我们使用爬虫时 遇到被JS加密的参数怎么办 有人会说用Selenium不就可以了么 但是Selenium执行又没效率怎么办 答案是 使用Python的execjs库直接执行JS脚本来获取加密后的参数 J
  • 【Linux操作小试牛刀】如何使用systemctl 命令管理 systemd服务

    前言 需求 当Linux中有许多系统服务 无法通过外部管理工具或者接口开启 关闭 需要手动管理时就需要用到systemctl命令 Systemd是基于Linux的操作系统的系统和服务管理器 用于管理服务 Systemd比旧的Sysvinit
  • [结构体]Cpp里结构体的几种常用写法

    1 定义并声明结构体变量 struct Date int year int month int day int main Date date 声明并定义了一个Date类型的变量date date year 2023 date month 9
  • Ubuntu 安装指定版本 python

    场景 在构建 docker 镜像的时候为了与 TensorFlow Pytorch 或者其他程序能兼容使用 需要安装指定版本的 python 常用的安装命令 apt get 有时候不能很 精确 指定 甚至是找不到源 隔山修路 遇水搭桥 py
  • golang和rust嵌入式开发初探

    本文简单的介绍了golang和rust语言在openwrt系统 mips架构下的交叉编译 环境 主机 系统 内核 架构 host主机 Centos 7 2 linux 3 10 0 327 x86 64 target主机 openwrt 1
  • unity拖拽drag_Unity全方位拖拽物体攻略

    Unity中UGUI控件和3D物体拖拽实现 基本原理 Unity拖拽的基本原理 射线检测 鼠标位置增量转换为统一空间的位置增量 将位置增量添加到拖拽物体原位置上 统一空间指的是将所有向量转换为同一空间下再进行计算 项目演示 左测 UGUI
  • blender基础认识(选项开关、工具栏、视图等)

    文章目录 引言 一 大纲选项开关和保存启动文件 1 大纲选项 1 禁用选中 2 视图影藏 3 视图禁用 4 渲染禁用 2 保存启动文件 二 工具栏和侧边栏 1 左侧工具栏 2 右侧工具栏 三 视图 1 视角 2 缩放 3 拖拽 4 摄像机视
  • AD PCB导出Gerber文件(非常详细的步骤)

    当我们的PCB绘制好 并仔细检查后 就可以把文件交给工厂生产了 一般有两种方式 第一种最简单 就是直接将PCB文件压缩打包 发给工厂 发给工厂的途径一般有两种 一种是在其官网上提交 一种是在其开发的应用程序上提交 嘉立创工厂就可以在其开发的
  • Hibernate笔记_如何处理OO中的一些特点

    1 对象属性是复合数据类型 composite user type 这其实是OO中的aggregation 和 composition Embeddable Embedded span style font size 14px packag
  • linux ctrl+z之后如何恢复

    在linux中使用matlab的时候 常常用ctrl z将matlab挂起 一开始并不知道怎么处理 也关不掉 后来发现用fg再回车就可以将后台挂起程序切换的前台来
  • 如何利用github搭建个人网站(无需购买云服务器)

    请看原创 转载来源 1 建立GithubPage 这里的作用就是说在github上建立一个仓库 并且将它设置成github的网页模式 其实我们后面的域名只是跳转到这个仓库的页面 首先新建一个仓库 然后注意设置仓库名字时要和你的githubI
  • Graph Correspondence Transfer for Person Re-Identification论文笔记

    摘要 提出了GCT 图关系迁移 模型解决行人重识别问题 与现存的方法不一样 GCT将行人重识别视为一个离线的图匹配问题和一个在线的关系迁移问题 在训练过程中 通过patch级别的图匹配 在具有不同姿势对配置的正样本对中离线的学习得到一个关系
  • 详解numpy.random.randn函数

    文章目录 正态分布 函数原型 参数解析 该函数的注意事项 示例代码 示例结果 参考 正态分布曲线绘制代码 numpy的random模块中的randn函数用于从 标准正态 方差为1 均值为0的正态分布 分布返回一个 或多个 float类型数据
  • Ubuntu20.04下交叉编译树莓派能运行的c++程序(不含第三方库)

    参见博主之前的博客 里面生成了test目标文件 现在将这个目标文件传到树莓派上 运行出现如下报错信息 这里因为我的编译平台 x64 Ubuntu操作系统 和目标平台 ARM raspbian操作系统 所以前者编译出来的东西并不能在目标平台上
  • Ant 组件动态表单多行输入框设置禁止编辑

    deep textarea ant input background color f5f5f5 cursor not allowed
  • ModelAndView: materialized View is [null];和Action的onSubmit()方法不被执行

    ModelAndView materialized View is null
  • JavaScript继承详解(五)

    http www cnblogs com sanshi archive 2009 07 14 1523523 html 在本章中 我们将分析John Resig关于JavaScript继承的一个实现 Simple JavaScript In
  • 统计学习方法——感知机

    基本模型 感知机1957年由Rosenblatt提出 是神经网络与SVM的基础 它是一个二分类的线性分类模型 其输入为实例的特征向量 输出为实例的类别 取 1和 1二值 线性方程w x b 0对应于特征空间Rn中的一个超平面S 其中w是超平
  • 解决用QtCreator编译examples时出现的错误

    下载最新 2010 04 版本的Qt之后 运行QtCreator 打开其examples工程 编译 出现 main moc No such file or directory 错误 在网上找了一下 发现下面这个讨论 http bugrepo
  • C/C++

    文章目录 C语言的预处理及编译过程分析 gcc v o build 1 c 主要步骤 预处理 相当于替换 示例 编译 汇编 让cpu认识代码 链接器 链接系统标准库 示例 摘自 麦子学院 C语言程序设计及快速入门 C语言的预处理及编译过程分