GCC编译过程(预处理,编译,汇编,链接)及GCC命令

使用 gcc(GNU Compiler Collection) 编译一个 C 或 C++ 程序时,整个编译过程可以分为以下几个阶段:


1. 预处理(Preprocessing)

  • 命令gcc -E source.c -o source.i
    在这一步,编译器处理所有的 预处理指令(如 #include#define 等),并展开宏,将头文件插入到代码中,同时移除注释。
主要操作:
  • 展开头文件:#include 中包含的头文件内容会插入到源文件中。
  • 宏替换:所有的宏定义(#define)会被替换为其实际值。
  • 条件编译:处理 #if#ifdef#else#endif 等指令。
  • 删除注释:代码中的注释会被移除。
输出

生成一个预处理后的代码文件,通常以 .i 结尾。


2. 编译(Compilation)

  • 命令gcc -S source.i -o source.s
    这一步将预处理后的源代码(.i 文件)转换为汇编代码.s 文件)。这是一种低级语言,接近机器指令,但仍然是人类可读的。
主要操作:
  • 语法分析:检查代码的语法是否正确,语法错误就是在这一步被检查出来的。
  • 语义分析:检查代码的逻辑是否合理(如类型匹配)。
  • 中间代码生成:将源代码转换为中间表示形式(IR)。
  • 优化:对中间代码进行优化(如移除冗余代码、优化循环结构等)。
  • 汇编代码生成:将优化后的中间代码生成对应的汇编代码。
输出

生成对应的汇编代码文件,通常以 .s 结尾。


3. 汇编(Assembly)

  • 命令gcc -c source.s -o source.o
    这一步将汇编代码(.s 文件)转换为目标代码.o 文件),目标代码是机器可执行的二进制指令,但它还不是完整的程序。
主要操作:
  • 汇编器将汇编代码翻译为机器语言,生成与平台相关的二进制代码。
输出

生成目标文件(.o 文件),这是一个中间文件,包含程序的二进制形式,但还未完成链接。


4. 链接(Linking)

  • 命令gcc source.o -o executable
    在这一步,目标文件(.o 文件)与所需的库和其他目标文件链接在一起,生成最终的可执行文件。
主要操作:
  • 将程序的多个目标文件整合成一个完整的程序。
  • 将程序中使用的外部库函数(如标准库中的 printfscanf 等)链接到程序中。
  • 解决符号引用:将函数调用与其实际实现关联起来。
  • 生成最终的可执行文件。
输出

生成一个可执行文件,通常以无扩展名的形式存在(如 executable),或者指定扩展名(如 executable.exe)。


完整编译流程命令:

如果直接用 gcc source.c -o executablegcc 会隐式地完成上述所有步骤,最终生成一个可执行文件。


流程示例:

假设有一个简单的程序 hello.c

#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}

编译步骤:

  1. 预处理

    gcc -E hello.c -o hello.i
    
    • 输出:hello.i,包含展开后的头文件和宏。
  2. 编译

    gcc -S hello.i -o hello.s
    
    • 输出:hello.s,汇编代码。
  3. 汇编

    gcc -c hello.s -o hello.o
    
    • 输出:hello.o,目标文件。
  4. 链接

    gcc hello.o -o hello
    
    • 输出:hello,最终的可执行文件。
  5. 运行程序

    ./hello
    
    • 输出:
      Hello, World!
      

直接使用一条命令和分别使用四条命令

  1. 直接生成可执行文件:

    gcc hello.c -o hello
    

    相当于预处理、编译、汇编和链接四步的组合。

  2. 查看中间文件:
    如果想检查某一步的中间输出,可以使用 -E-S-c 分别生成对应的预处理、汇编和目标文件。


扩展:调试和优化

  1. 添加调试信息:
    使用 -g 选项在编译过程中生成调试信息,用于调试工具(如 gdb):

    gcc -g hello.c -o hello
    
  2. 优化代码:
    使用 -O 选项优化代码:

    • -O0:无优化(默认)。
    • -O1:基本优化。
    • -O2:更高的优化。
    • -O3:最高级别优化。
    • 示例:
      gcc -O2 hello.c -o hello
      
  3. 指定标准:
    使用 -std 指定 C 或 C++ 的标准,如:

    gcc -std=c99 hello.c -o hello
    

总结

gcc 的编译过程分为预处理、编译、汇编和链接四个阶段。可以通过不同的命令选项分别查看每个阶段的输出,或者直接用简化命令一键完成所有步骤。通过掌握这些步骤,你可以更深入地理解 C/C++ 程序的编译机制,并根据需求调整编译选项来优化程序的性能或调试问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…

【机器学习】超简明Python基础教程

Python是一种简单易学、功能强大的编程语言&#xff0c;适用于数据分析、人工智能、Web开发、自动化脚本等多个领域。本教程面向零基础学习者&#xff0c;逐步讲解Python的基本概念、语法和操作。 1. 安装与运行 安装Python 从官网 Welcome to Python.org 下载适合自己系统的…

小熊派Nano接入华为云

一、华为云IoTDA创建产品 创建如下服务&#xff0c;并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码&#xff1a;小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…

形态学图像处理(Morphological Image Processing)

形态学图像处理(Morphological Image Processing) 前言 ‍ 本博客为个人总结数字图像处理一课所写&#xff0c;并给出适当的扩展和相应的demo。 写博客跟做 checkpoint​ 很像&#xff0c;毕竟个人还不能达到那种信手拈来的境界&#xff0c;忘了就是从零开始训练&#xff0…

[webgis 0基础到找工作]------JavaScript--DOM事件进阶 day10

1.事件流 事件流是对事件执行过程的描述&#xff0c;了解事件的执行过程有助于加深对事件的理解&#xff0c;提升开发实践中对事件运用的灵活度。 简言之&#xff0c;捕获阶段是【从父到子】的传导过程&#xff0c;冒泡阶段是【从子向父】的传导过程。 1.1捕获和冒泡 如果事件…

TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?

首先ThreadLocal是什么就不介绍了&#xff01;这篇是讲讲里面的东西。 再简单说一下强引用和弱引用&#xff0c;举个例子&#xff0c;我们平常new出来的对象就是强引用的&#xff0c;在栈中有强引用&#xff0c;所以在gc的时候&#xff0c;堆中的实例对象不会被清除掉。 弱引…

第一次shell作业

#接受用户输入的服务名称 read -p"输入需要部署的服务名称: " server_name if [ "service_name" "nginx" ]; then #判断服务是否安装 if command -v nginx > /dev/null 2>&1; then echo "nginx 已安装" #自定义网…

MATLAB图注意力网络GAT多标签图分类预测可视化

全文链接&#xff1a;https://tecdat.cn/?p38321 本示例展示了如何使用图注意力网络&#xff08;GATs&#xff09;对具有多个独立标签的图进行分类。当数据中的观测值具有带有多个独立标签的图结构时&#xff0c;可以使用GAT来预测未知标签观测值的标签&#xff08;点击文末“…

CSS优化file控件样式

<div class"file-box"><input type"button" class"btn" value"选择文件" /><inputtype"file"class"file"id"upimg"change"previewFiles"multiple/></div><!-- Vu…

Go语言24小时极速学习教程(三)常见标准库用法

常见标准库 常见标准库即Go语言自带的库&#xff0c;这里的所有包都可以通过import直接引入&#xff0c;如果你觉得实在是不好用&#xff0c;那么请先保证你学会了标准库的基础上&#xff0c;再学一下Gookit&#xff0c;特别是其中的GoUtil&#xff0c;千万不要轻易自己去造轮…

CTF--php伪协议结合Base64绕过

Base64绕过 在ctf中&#xff0c;base64是比较常见的编码方式&#xff0c;在做题的时候发现自己对于base64的编码和解码规则不是很了解&#xff0c;并且恰好碰到了类似的题目&#xff0c;在翻阅了大佬的文章后记录一下&#xff0c;对于base64编码的学习和一个工具 base64编码是…

虚拟网卡驱动和DM9000C移植

网卡驱动程序框架 网卡驱动程序“收发功能”&#xff1a; 只要把上层的数据发给网卡&#xff0c;从网卡来的数据构造成包给上层即可。网卡只需要 “socket”编程&#xff0c;不需要打开某设备。 驱动程序都是以面向对象的思想写的&#xff0c;都有相关的结构体。 编程步骤 …

image compare pyqt 实现

默认显示image1, 鼠标滑动滚动条切换图片显示 可视化效果: image_compare.py import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QVBoxLayout, QHBoxLayout from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QPixmap, QPainte…

【单片机基础】定时器/计数器的工作原理

单片机中的定时器/计数器&#xff08;Timer/Counter&#xff09;是用于时间测量和事件计数的重要模块。它们可以用来生成精确的延时、测量外部信号的频率或周期、捕获外部事件的时间戳等。理解定时器/计数器的工作原理对于单片机编程和系统设计非常重要。以下是定时器/计数器的…

在自动驾驶进行大数据量因果推理实验时,如何减少无用功,提高实验效率?

在对实验结果做反事实推理时&#xff0c;通常需要对数据进行多次循环&#xff0c;然后对多次循环的结果进行处理&#xff0c;如果只在最后结果结束时&#xff0c;再进行处理&#xff0c;可能会由于反事实过程中某个参数设置错误&#xff0c;导致整个反事实实验出现错误&#xf…

浅谈软件开发中的yield关键字:从餐厅服务理解异步编程之美

在现代软件开发中&#xff0c;处理大量数据流时经常会遇到性能和内存消耗的问题。传统的编程方式往往是一次性获取所有数据&#xff0c;这就像餐厅厨师要把所有菜品做完才上菜一样&#xff0c;既不高效也不够灵活。而yield关键字的出现&#xff0c;为我们提供了一种优雅的解决方…

绕过CDN寻找真实IP

在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器&#xff0c;实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…

深度学习:神经网络中的损失函数的使用

深度学习&#xff1a;神经网络中的损失函数的使用 损失函数是监督学习中的关键组成部分&#xff0c;用于衡量模型预测值与真实值之间的差异。优化算法&#xff08;如梯度下降&#xff09;通过最小化损失函数来调整模型参数&#xff0c;以提高模型的预测精度。以下是几种常用的…

ThreeJS入门(142):THREE.WebGLRenderTarget 知识详解,示例代码

作者&#xff1a; 还是大剑师兰特 &#xff0c;曾为美国某知名大学计算机专业研究生&#xff0c;现为国内GIS领域高级前端工程师&#xff0c;CSDN知名博主&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;webgl&#xff0c;ThreeJS&#xff0c;canvas&#xf…