c程序生成过程

【C/C++】程序生成过程及调试 概述程序从编写、预处理、编译、汇编、链接的过程,掌握基本的调试方法 阅读详情

 

   在vc6下写一个c程序,点一下编译 点一下链接,程序就能跑了。但我们的程序是如何从代码编程计算机课可执行的文件的,好像不是很清楚,这个IDE悄悄帮我们做了好多事情。 我们的程序从代码变成机器可执行的机器码,一般经过预编译,编译,汇编,链接。这几个步骤,为什么是这样的几个步骤,我觉得这是和编程语言的发展历史有关。

      最早写程序与计算机交流用机器码,打纸袋的年代。后来发展出了汇编语言,然后再有了我们现在用的高级语言。现在写程序一般都是用高级语言,这便于程序员使用,但计算器其实不认识这些,它只认识机器 0 1 码。所以要把我们写的高级语言一步步再转换成机器码,经过编译,高级语言编程汇编语言,经过汇编,汇编语言编程机器语言,这时计算机才能读懂执行。

在linux下用gcc编译一个c程序 能很好的体会上述过程

gcc编译器有这么几个选项 -E   -S   -c    其实是分别对应上述四个过程的

当写了一个test.c

 

gcc -E  test.c -o test.i

这一步只进行预处理,简单理解就是解决你程序中  #  开头的那行东西,例如将include的文件代码加进来,进行一些宏替换,判断一些条件编译等。 生成test.i目标文件。


gcc -S test.i -o test.s

这一步只进行汇编,将高级语言转换成汇编代码。 生成test.s   .s后缀的是汇编语言文件


gcc -c test.s -o test.o

这一步进行汇编,将.s 文件里的汇编语言转换成机器码。test.o


gcc test.o -o test

这一步进行连接,如果程序有多个相关的.o文件 会被连接起来,还做一些库函数的连接等,执行完这一步,就生成可以执行程序了。


       啰嗦一下整个过程: 先将你的宏处理掉,包含的文件代码加进来,然后把这些代码转换成汇编语言,再将汇编语言转换成机器码,最后在再将一些不同文件中声明定义的变量啊  函数啊 包括库函数什么的链接起来 ,就生成可执行程序了。


GCC编译器的基本选项如下表:

类型 说明
-E 预处理后即停止,不进行编译、汇编及连接,生成.i文件
-S 编译后即停止,不进行汇编及连接, 生成.s文件
-c 编译或汇编源文件,但不进行连接,生成.o文件
-o file 指定输出文件file,生成可执行文件
这是一个

一些文件后缀,对照一下



.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx为后缀的文件,是C 源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C 源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。


Linux下gcc编译c程序生成可执行文件的过程 Linux下gcc编译c文件生成可执行文件 一、准备 hello.c 文件 1、在当前目录下新建c文件 $:vim hello.c 2、按i进入编辑模式。按esc退出编辑模式,输入源代码 #include <stdio.h> int main(void) { printf("hello world"); return 0; } 退出编辑模式,按住shift+两次z 阅读详情

相关推荐

单相全桥逆变器中比例谐振(PR)控制的优化设计与实现

本文深入探讨了比例谐振(PR)控制在单相全桥逆变器中的优化设计与实现。通过对比PID控制,详细阐述了PR控制在50Hz基波频率处实现无静差跟踪和强抗干扰性的原理。文章提供了从理论建模、参数整定(Kp, Kr, ωc)到仿真验证的完整实战流程,并介绍了准比例谐振(QPR)控制以增强频率鲁棒性,以及多谐振点设计以抑制特定谐波等进阶优化方法,最终实现THD从3%降至1%以内的显著性能提升。

weixin_29056781的博客 176

【无标题】

编写一个程序,生成以下输出: Brazil, Russia, India, China India, China, Brazil, Russia 除了main()以外,该程序还要调用两个自定义函数:一个名为 br(),调用一次打印一次“Brazil, Russia”;另一个名为 ic(),调用一次打印一次“India, China”。其他内容在 main()函数中 完成。 代码如下: #include<stdio.h> int br(); int ic(); int main() { br(

无知者2012 360

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 486

C Primer Plus(第6版)第二章答案

1. #include int main (void) { printf ("Gustav Mahler"); printf ("Gustav\nMahler\n"); printf ("Gustav "; printf ("Mahler"); return 0; }

sirius_black_tea的博客 599

Unity开源游戏源码精选:17个亲测可运行教学项目

Unity游戏开发中,掌握真实项目结构与工程实践远比熟记API更重要。本文围绕‘Unity开源项目’和‘游戏源码’两大核心概念,解析高质量开源资源的本质特征——结构清晰、逻辑可溯、修改即时反馈。从基础的MonoBehaviour生命周期组织,到进阶的ScriptableObject数据驱动、事件总线解耦,再到架构级的DOTS ECS设计与网络同步模式,技术价值在于将抽象原理落地为可调试、可验证、可迁移的代码范式。适用于新手建立开发直觉、中级开发者突破系统设计瓶颈,以及团队构建可维护框架。所有项目均基于Uni

weixin_31528001的博客 716

双脉冲测试中IGBT驱动电阻和驱动电容的研究

  在LTspice中没有双脉冲波形发生器,要做一个双脉冲的波形只能用电压源来进行特殊设置,不是很方便,为此我写了一个双脉冲波形发生器,有需要的可以下载。双脉冲波形发生器。   如下,该元器件可以自定义延迟时间Td,第一个脉冲宽度T1,第二个脉冲宽度T3,两个脉冲间隔T2,脉冲循环个数Ncycle以及高低电平Vhigh,Vlow。       IGBT开通时Rg的影响: 如果增大Rg: ①开通延...

gaoyong_wang的博客 8349

一个程序是如何生成的

很多刚接触编程的同学,应该都会学到一个“Hello world”的程序,通常教程中都会教先安装一个IDEA,然后在IDEA中敲入代码,编译然后运行,简单的“Hello world”程序就完成了。但你是否有想过从敲完代码后的源文件,到输出“Hello world”的可执行文件,这中间到底经历了什么过程呢?下面由我根据最近学到的知识,讲解一下这中间经历的过程吧。

m0_47965537的博客 1010

7.3 空间矢量调制(SVM)整数算法

本文提出了一种基于整数运算的空间矢量调制(SVM)优化实现方案,适用于计算资源有限的Cortex-M0平台。针对传统SVM算法中复杂的三角函数和浮点运算问题,重点优化了扇区判断和占空比计算两个关键环节。在扇区判断方面,采用基于电压分量符号和相对大小的三变量法,避免了角度计算;在占空比计算方面,通过几何关系将作用时间表示为电压分量的线性组合,并采用定点数实现。方案还详细讨论了系数定点化、死区补偿等实现细节,在保证精度的同时显著降低了计算复杂度。实验结果表明,优化后的整数算法在M0平台上仅需50-80个周期即可

技术工作者 943

程序生成的三个阶段

 程序生成主要分成编译、汇编、连接等几个步骤: 编译是指把用高级语言编写的程序转换成相应处理器的汇编语言程序的过程。从本质上讲,编译是一个文本转换的过程。对嵌入式系统而言,一般要把用C语言编写的程序转换成处理器的汇编代码。编译过程包含了C语言的语法解析和汇编语言的生成两个步骤。汇编一般是逐个文件进行的,对于每一个C语言编写的文件,可能还需要进行预处理。 汇编是从汇编语言程序生成目标

lchunli的专栏 1454

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

【漏洞复现】永恒之蓝 MS17-010 远程溢出漏洞(CVE-2017-0143)

文章目录声明前言一、漏洞原理简述二、漏洞代码深层解析三、实验步骤四、漏洞补丁总结 声明 本篇文章仅用于技术研究与技术学习,切勿用于非授权下攻击行为,切记! 前言 Windows7 存在 MS17-010 永恒之蓝(远程溢出漏洞) ,该漏洞是方程式组织在其漏洞利用框架中一个针对SMB服务进行攻击的漏洞,该漏洞导致攻击者在目标系统上可以执行任意代码 一、漏洞原理简述 MS17-010漏洞出现在Windows SMB v1中的内核态函数 srv!SrvOs2FeaListToNt 在处理FEA(File Ex

李同學AI安全 9627

程序生成过程

程序编译过程主要包括预处理、编译、汇编和链接四个阶段:预处理阶段处理头文件、宏替换等;编译阶段进行语法分析生成汇编代码;汇编阶段将代码转换为机器指令;链接阶段组合目标文件生成可执行程序。编译期完成程序构建,运行期实现程序功能。类是编译期概念,定义成员访问权限;对象是运行期实例化产物。

m0_60656600的博客 556

无迹卡尔曼滤波 (UKF, Unscented Kalman Filter) 算法详解及案例分析

无迹卡尔曼滤波是一种用于估计非线性系统状态的递归算法。其目标是通过结合系统模型和观测数据,估计系统的最优状态。

闲人编程的博客 2625

C程序的编译过程及生成文件详解

C程序的编译过程及生成文件详解

m0_73931287的博客 3682

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C程序的生成过程

1.C程序是先由源文件经编译生成目标文件,然后经过连接生成可执行文件。 2.源程序的扩展名为.c,目标程序的扩展名为.obj,可执行程序的扩展名为.exe。

xxaichishizi的博客 792

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言程序生成过程

C语言程序生成过程 编译期 预处理: 将源文件当中的预处理指令替换为对应的内容

weixin_44708229的博客 1837

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C/C++程序编译运行生成过程分析

C/C++程序编译步骤 如何生成可执行文件      **************************************************************************篇一****************************************************************************************

nkliujianghunter的专栏 371

(3)C程序可执行文件的生成过程

如图,可见,如果jmp L0 和 sub C之间加入了新的指令,则只要重新确定sub C指令的地址,再填入L0即可。编译过程就是将预处理后得到的预处理文件(如hello.i)进行词法分析、语法分析、语义分析、优化后,生成汇编代码文件。经过预编译处理后,得到的是预处理文件(如,hello.i),它还是一个可读的文本文件,但不包含任何宏定义。汇编的结果是一个可重定位目标文件(如,hello.o)其中包含的是不可读的二进制代码。经过编译后,得到的汇编代码文件(如,hello.S)还是一个可读的文本文件。

zxf347085420的博客 946

C/C++程序从编译到最终生成可执行文件的过程分析

C/C++程序从编译到最终生成可执行文件的过程分析 转载地址:http://www.52rd.com/Blog/Detail_RD.Blog_hustsimoon_5196.html 电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机的语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由“0”和“1”组成的指令序列交由计

2010yhh 968

【C语言】.c源文件从编译到链接生成可.exe执行程序的过程

.c源文件 编译 链接 预编译 编译 预处理预编译 汇编 .o目标文件 汇编代码 .exe二进制程序 程序员的自我修养 编译 链接 装载 库

m0_52602233的博客 3323

make, makefile,cmake、C/C++从源代码到生成可执行程序的过程详解

make, makefile,cmake区别: https://blog.youkuaiyun.com/Aiyanghong/article/details/86501720 为什么要makefile,makefile简单实例 https://blog.youkuaiyun.com/Andrew659/article/details/6307324?depth_1-utm_source=distribut...

专心扫地 1076

C语言中生成可执行程序的过程

预处理:展开头文件/进行宏替换/去掉注释/条件编译 编译:检查语法是否有错误,生成汇编代码 汇编:将汇编代码转换可供机器识别的机器码 链接:将多个文件链接到一起生成可执行程序 ...

三毛创作记 1954
上一篇: 进程内存映像的地址空间布局
下一篇: Linux下编程练习——bitset
github_24924857
博客等级 码龄12年 16粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值