3.C程序编译步骤

目录

1  预处理

2  编译

3  汇编

4  链接

5  文件大小情况


依次执行下面4个步骤

  1. 预处理
    • 将所有头文件展开,比如stdio.h等,展开就相当于把stdio.h中的所有代码粘贴到你的代码里。
    • 将所有的宏文件展开,像stdio.h是官方定义的头文件,宏文件可以理解为自定义的头文件
    • 进行条件编译,比如:获取编译环境信息,比如当前是什么系统,系统位数是多少。再比如获取编译成exe的名字
    • 将代码中的注释删掉
    • 在预处理阶段不会检查语法
  2. 编译:
    • 检查语法,检查没问题后将预处理后的文件生成汇编文件
  3. 汇编
    • 将汇编文件生成目标文件(二进制文件)
  4. 链接
    • .h文件也是高级语言,它有一些在上述过程中无法转换为二进制,在这一步会将目标文件与一些必要的库链接起来,最终生成一个二进制文件
    • 如果你用了头文件的函数但并没有导入头文件会在这一步报错而不是编译时报错

我们可以使用gcc进行分步编译

1  预处理

helloworld.c文件是这样的

通过预处理 由.c文件得到.i文件

用记事本打开helloworld.i,首先可以发现头文件被展开了

拉到最下面发现之前的注释消失了

2  编译

由 .i 文件得到 .s文件

用记事本打开helloworld.s发现里面变为了汇编语言,汇编语言中别的不一定认识,这个movl只要接触过汇编语言的应该有所了解

  • 这里的汇编格式是GCC的格式,所以和我们自己写的汇编不是很一样,有的地方会啰嗦些

3  汇编

由 .s 文件得到 .o文件

记事本的默认编码方式应该是utf-8,.o文件是二进制文件,你用记事本打开就乱码了

二进制是人类看不懂的,如果你想打开你可以用python下面的代码打开它 

with open('E:\\笔记\\C语言笔记\\代码\\3.C程序编译步骤\\helloworld.o','rb') as f:print(f.read())

4  链接

由.o文件得到exe文件

  • 写不写最后的exe都会给你搞出一个exe来

关于链接的库,实际上就是dll文件,你可以用 dependcy walker.exe 来查看链接库的情况,首先到官网进行下载 Dependency Walker (depends.exe) Home Page

我当前系统是win10,我下载的是这个

下载后得到一个压缩包,压缩包解压后会得到下面三个文件

双击打开exe后,先点击options然后点击Configure Module Search Order。这个是设置从哪里找。我们需要限制寻找的范围,不然depends.exe会未响应

会从右边找库,移动到左边表示不从那里找。比如我现在将PATH移动到左边,就表明不从PATH中找库了

移动完毕之后是这样的

如果你还想添加路径,那就点Browse,然后找到你要添加的路径,之后点击Add Directory

确定后点击OK

之后点击OK关闭窗口,然后把需要看链接的exe拖到Dependency Walker就可以看到链接的情况了

5  文件大小情况

在.i文件中由于把头文件展开了,它里面放的内容多,所以文件比.c文件大了很多。exe最大

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

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

相关文章

STM32F407-14.3.11-01互补输出和死区插入

互补输出和死区插入 高级控制定时器(TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间。 这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延迟、开关器件产生的延迟...&…

海云安参与制定《信息安全技术 移动互联网应用程序(App)软件开发工具包(SDK)安全要求》标准正式发布

近日,由TC260(全国信息安全标准化技术委员会)归口 ,主管部门为国家标准化管理委员会,深圳海云安网络安全技术有限公司(以下简称“海云安”)等多家相关企事业单位共同参与编制的GB/T 43435-2023《…

redis 安装在liunx安装和常用文件配置

文章目录 安装配置文件设置测试启动服务连接服务 安装 1.官网下载压缩包: https://redis.io/download/ 2.将压缩包上传到Linux环境中 解压: tar -xvf redis-xxxxx 3.liunx 需要c的环境 yum -y install gcc-c4.进入redis文件夹 make && make install5.推荐不是必须…

内存垃圾回收

对一个方法调用完成后,如何立即恢复该方法使用的内存: 一、 在Java中,垃圾回收是由Java虚拟机(JVM)自动管理的,而不是由程序员手动进行的。垃圾回收器会自动检测不再被引用的对象,并释放其占用…

游戏的UI管理的完整机制总结及框架展示

目录 UI管理机制总结 层级管理 显示类型 SoringLayer 使用列表记录处于不同状态的页面 供外调用的增删改查函数 资源预加载函数 外部回调执行函数 遮罩效果 还原界面 事件系统 垃圾回收 UI管理机制总结 自己根据源码总结出的一套UI管理机制,大概讲述了如…

网络调试助手 连接Onenet 多协议接入平台 TCP透传协议

onenet文档链接 多协议接入地址 打开Onenet平台,多协议接入 选择TCP透传协议,点击添加产品,输入信息,点击确认 点击设备列表,添加设备 下面需要上传一个解析脚本文件该文件的下载地址lua文件下载地址 建立连接 设备…

策略模式终极解决方案之策略机

我们在开发时经常会遇到一堆的if else …, 或者switch, 比如我们常见的全局异常处理等, 像类似这种很多if else 或者多场景模式下, 策略模式是非常受欢迎的一种设计模式, 然而, 一个好的策略模式却不是那么容易写出来. 我在工作中也因为写烦了switch,if else 觉得很不优雅, 因…

2022 China Collegiate Programming Contest (CCPC) Guilin Site

A.Lily Problem - A - Codeforces 题意 思路 数所有周围没L的格子 #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int mod 1e9 7; constexpr int Inf 0x3f3f3f3f; constexpr double eps 1e-10;std::string s;int n;void solv…

cv2.threshold 图像二值化

图像二值化 whatparameters示例 what cv2.threshold是OpenCV中用于进行图像二值化的函数。它的作用是将输入图像的像素值转换为两个可能的值之一&#xff0c;通常是0&#xff08;黑色&#xff09;或255&#xff08;白色&#xff09;&#xff0c;根据一个设定的阈值。图像二值化…

DAPP开发【04】测试驱动开发

测试驱动开发(Test Driven Development)&#xff0c;是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码&#xff0c;然后只编写使测试通过的功能代码通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码&#xff0c…

主题色变量和var实现多套主题换肤

文章目录 一、前言1.1、[VueElementUI实现多套主题换肤](https://blog.csdn.net/u012804440/article/details/133975511)1.2、[VueElementUI实现在线动态换肤](https://blog.csdn.net/u012804440/article/details/133975570) 二、实现2.1、多主题色定义2.2、根节点属性修改2.2.…

RK3568平台开发系列讲解(Linux系统篇)device_node 转换成 platform_device

🚀返回专栏总目录 文章目录 一、DTB转换规则二、转换源码分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树 device_node 转换成 platform_device 一、DTB转换规则 device 部分是用 platform_device 结构体来描述硬件资源的, 所以内核最终会将…

NodeJs脚手架(Koa)的简单使用

文章目录 前言一、与express的区别express-generator 提供的功能如下koa-generator 提供的功能如下两个生成器共同支持的项目骨架描述如下 二、使用步骤安装 Koa 生成器使用koa2创建项目PM2的使用 三、基础目录说明配置文件package.json入口文件 bin/www核心文件 app.jsroutes …

剑指 Offer(第2版)面试题 17:打印从 1 到最大的 n 位数

剑指 Offer&#xff08;第2版&#xff09;面试题 17&#xff1a;打印从 1 到最大的 n 位数 剑指 Offer&#xff08;第2版&#xff09;面试题 17&#xff1a;打印从 1 到最大的 n 位数解法1&#xff1a;字符数组解法2&#xff1a;全排列 剑指 Offer&#xff08;第2版&#xff09…

前端实现token无感刷新的原因和步骤

前端实现无感刷新 需要这么做的原因 在使用过程中&#xff0c;如果token过期&#xff0c;再操作页面可能就需要重新返回登录页获取token了&#xff0c;在持续使用的过程中可能会出现多次跳去登录页的情况&#xff0c;用户体验很不好。所以需要做无感刷新 做token无感刷新的方…

windows下ffmpeg源码编译

参考&#xff1a;windows上使用vs2019和msys64编译 ffmpeg 4.3 | 码农家园 (codenong.com) 安装命令&#xff1a; pacman -S nasm pacman -S yasm pacman -S make pacman -S cmake pacman -S diffutils pacman -S pkg-config pacman -S git 1.编译 x264 将 x264放到home文件下…

mfc 设置excel 单元格的列宽

CString strTL, strBR;strTL.Format(L"%s%d", GetExcelColName(cd.nCol), cd.nRow);strBR strTL;CRange rangeMerge range.get_Range(_variant_t(strTL), _variant_t(strBR));rangeMerge.put_ColumnWidth(_variant_t((long)(20))); 宽度设置函数为 &#xff1a; pu…

CSS新手入门笔记整理:CSS背景样式

背景颜色&#xff1a;background-color 语法 background-color:颜色值; 颜色值有两种 一种是“关键字”&#xff0c;指的是颜色的英文名称&#xff0c;如red、green、blue等。参考CSS 颜色名称。另外一种是“十六进制RGB值”&#xff0c;类似“#FBE9D0”形式的值。参考十六…

HT78621 3.5A开关限流降压变换器基本参数信息

HT78621是一款高压降压开关稳压器&#xff0c;可向负载提供高达2A的连续电流。 HT78621 特性&#xff1a; ・宽输入电压: 5V – 60V ・峰值开关电流限值典型3.5A ・Z高1MHz开关频率 ・支持PWM调光控制输入&#xff0c;应用于LED ・集成G端MOSFET的短路保护 ・200μA静态电…

CentOS7 防火墙常用命令

以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令&#xff1a; 检查防火墙状态&#xff1a; sudo firewall-cmd --state 启动防火墙&#xff1a; sudo systemctl start firewalld 停止防火墙&#xff1a; sudo systemctl stop firewalld 重启防火墙&…