首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言程序编译成可执行文件的过程

现在我们有一个C语言文件(hello.c): #include int main() { printf("hello, world!...\n"); return 0; } 现在我们将执行以下命令将源文件(hello.c)转化为可执行目标文件(hello): gcc -o hello hello.c 我们使用的gcc编译器驱动程序完成的...这个转化的过程可分为四个阶段完成。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。...预处理器(cpp)根据字符#开头的命令,修改原始的C程序。结果就得到了另外一个C程序,通常是以.i作为文件扩展名。 编译阶段。...编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编程序是非常有用的,它位不同高级语言的不同编译器提供了通用的输出语言。 汇编阶段。

2.8K20

C语言程序的翻译环境和执行环境

任何C语言的编译器都在ANSIC的基础上扩充的。张三同学这个我们还是必须要了解的。...翻译环境 这幅图来表示下面所讲述的过程ヽ(✿゚▽゚)ノ 每个源程序也就是.c(可以是多个源程序)文件实际上都会经过编译器的处理,最后在各自生成一个目标文件.obj。...它的指令:gcc test.c - E (预处理后就停止) Ⅱ→编译:把C语言的代码转换成汇编代码,那么肯定要做什么事情也就是我们所说的一个过程实际上有:语法分析、词法分析、语义分析、符号汇总(汇总全局变量的符号...具有部分链接的文件可能的,如库程序,在目标文件中仍含有未解决的地址。 运行环境 程序执行过程如下⇣ ①程序必须载入的内存当中,在操作系统的环境中的环境中:一般都是由这个操作系统完成的。...当然程序也可以同时使用静态(stack)内存,存储于静态内存中的变量程序的整个执行过程一直会保存它们的值得。

97220
您找到你想要的搜索结果了吗?
是的
没有找到

C语言编译过程

编译---->形成目标代码,目标代码在目标机器上运行的代码。 连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序)。...如果用一张图来表示: image.png 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序...经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。 4.汇编过程 汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。...对于被翻译系统处理的每一个C语言程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。 目标文件由段组成。...经过上述五个过程C程序就最终被转换成可执行文件了。缺省情况下这个可执行文件的名字被命名为a.out。 老九学堂出品

1.9K20

C语言编译过程

代表接下来的文本应该被当做包含一个隐式的extern "C 块 编译 1.高级语言->汇编代码 命令 gcc -S a.i -o a.s .file "a.c" .globl _...a.s -o a.o 得到的结果二进制文件。...链接 使用到了C标准库的东西“printf”,但是编译过程只是把源文件翻译成二进制而已,这个二进制还不能直接执行,这个时候就需要做一个动作,将翻译成的二进制与需要用到库绑定在一块。...函数库一般分为静态库和动态库两种 静态库指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。...动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。

1.8K20

C语言笔记】C语言编译的过程

1、前言 如果你使用的集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?...\n"); return 0; } 其经历如下过程: ? 如图,编译生成可执行文件的过程实际包含四个过程:(1)预处理;(2)编译;(3)汇编;(4)链接。...预处理的命令为: gcc -E test.c -o test.i 上述命令中-E让编译器在预处理之后就退出,不进行后续编译过程;-o指定输出文件名。 预处理之后得到的仍然文本文件。...目标文件test.o二进制文件,部分内容截图如下: ? 5、链接(Linking) 链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。...链接过程的命令为: gcc test.o -o test.exe 综上,生成可执行程序过程为:预处理、编译、汇编、链接。各个命令如下图所示: ?

12.1K30

【编程基础】C语言从源程序到可执行程序

二.文本信息到可执行程序 不论.c, .cpp 还是.h文件,所有的这些我们称之为程序的东西都是文本信息。他们都无法被计算机认识。...计算机只认识0和1.所以要让计算机执行我们用文本信息表示的程序,必须将这些文本信息表示的程序翻译成计算机认识的01代码串。...在linux下,以helloworld.c为例,使用gcc编译器,这个翻译过程一般分为以下四个步骤: 1).preprocessing预处理。...不同的编译器有不同的汇编语言表示方式。GCC下,用 gcc helloworld.c -o helloworld.s -S 可以得到编译后用gcc汇编语言表示的文本信息。...4)linking链接 由于我们引用了别的库中的符号,我们需要将这些符号的二进制指令集以某种方式装入到我们程序中,最后经过一些处理后才得到了能被计算机识别的可执行程序

1.2K40

用gcc编译c语言程序以及其编译过程

对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言执行过程,加深对c语言的理解很重要!!!...通过这一步我们知道 C语言跟汇编的 关系,至于他们之前如何进行转换的,大家可以进行更深入的学习与探讨。 ? 此时目录下多了一个hello.s文件,内容如下图所示: ?...gcc -o hello.o hello.s -c 或者 gcc -o hello.o -c hello.s 或者 gcc -c hello.s -o hello.o (-c 参数:gcc对目标文件执行指令转换的操作...gcc -o hello hello.o  或者 gcc hello.o -o hello(注意:gcc没有单独的链接参数) 将系统库函数与hello.o进行链接(简言之合并),得到可执行程序,该程序的名字叫...(即可执行程序需要用到什么库呢?) 使用命令 ldd hello 查看。 ? (注意;用c语言写的代码依赖的库最少,如果使用其他语言依赖的库更多哦!!需要装好多包包。)

1.6K10

C语言中内存分布及程序运行加载过程

一个程序内存分配: 下图APUE中的一个典型C内存空间分布图(虚拟内存) 例如: #include int g1=0, g2=0, g3=0; int max(int i) { int m1=...version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xd66ac36636c4fcfcbe395efb6bbd38c053e1c6c7..., not stripped ELF目标文件格式的最前端ELF文件头(ELF Header), 包含了描述整个文件的基本属性,如ELF版本、目标机器型号、程序入口地址等 3 加载: 图1做了简单的说明...(Linux系统下的) 左边的UNIX/LINUX系统的执行文件,右边对应进程逻辑地址空间的划分情况。...我理解就是类似mmap函数 直接内存映射 1 ELF文件头 指定加载入口地址 2 加载 代码段 数据段 其他部分 参考 1 Linux内核如何装载和启动一个可执行程序 http://www.cnblogs.com

2K80

c语言文件打包成exe可执行程序

如何将编写的c语言程序打包成exe可执行文件呢? 以前我们写程序很多是在编辑器上,让编辑起来编译运行我们的程序。如果想将其打包成exe可执行文件该如何做?...gcc包括cc++编译器 gcc和cc一样的,c++和g++一样的,一般c程序就用gcc编译,c++程序就用g++编译。 我们用gcc命令来编译我们的c语言程序。...text.c代表你的要操作的c语言文件,-o后面的代表你要给生成的exe的命名。 我们只需要知道这些。 那么我们在哪里寻找gcc命令呢?...15:就在我的这个c文件的下边。我们可以把它拖出来,或者拖到桌面上,直接打开。我们来看 这就是我们生成的exe文件的效果。 当然我们可以编写更多的c语言文件,然后打包。...打包后的exe文件一旦打开就执行程序。 欢迎猿友们访问留言。 相关的请遵守csdn协议 -------jgdabc

2.8K60

C#在.NET编译执行过程

1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。...程序集要么执行的,要么DLL 程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言 程序集包含如下信息: 程序的CIL 程序中使用的类型的元数据 对其他程序集引用的元数据 2.  ...程序的编译过程    程序的CIL直到它被调用运行时才会被编译成本机代码。...程序集中的可执行代码只在需要的时候由JIT编译器进行编译,然后它就被缓存起来以备在后来的程序执行。这就意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被执行一次。...托管代码:为.NET框架编写的代码称为托管代码,需要CLR 非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码 3.编译和执行过程

65610

C#在.NET编译执行过程

1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。...程序集要么执行的,要么DLL 程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言 程序集包含如下信息: 程序的CIL 程序中使用的类型的元数据 对其他程序集引用的元数据 2.  ...程序的编译过程    程序的CIL直到它被调用运行时才会被编译成本机代码。...程序集中的可执行代码只在需要的时候由JIT编译器进行编译,然后它就被缓存起来以备在后来的程序执行。这就意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被执行一次。...托管代码:为.NET框架编写的代码称为托管代码,需要CLR 非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码 3.编译和执行过程图 ?

1.3K90

Java 程序执行过程的内存分析

Java 程序执行过程的内存分析 内存分析先知 栈: 1、每个线程私有,不能实现线程间的共享! 2、局部变量放置于栈中。 3、栈由系统自动分配,速度快!栈一个连续的内存空间!...2、堆一个不连续的内存空间,分配灵活,速度慢! 方法区: 1、被所有线程共享! 2、用来存放程序中永远不变或唯一的内容。(类代码信息、静态变量、字符串常量) ?...; } } Test1类 重点:注意看代码里的注释,我把每一条的语句的执行过程都做了很详细的讲解 public class Test1 { public static void...,开一个栈帧,执行完成后释放这个栈帧。...这是对上面 Test1 类执行代码的内存分析图!!!

55710

Java程序执行过程及内存机制

本讲将介绍Java代码如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程发挥着怎样的作用。...Java程序执行过程 ZOYfmKJIopUDleP.jpg 步骤 1: 写源代码,源代码将以.java的文件格式保存在电脑硬盘中。...那么JIT编译器(Just-In-Time Compiler)如果参与进程序执行过程中呢?让我们来看以下两个例子。...情况 2: 这是JIT编译器参与进Java执行过程的情况,JIT编译器会扫描所有代码并对其进行优化。例如此时它发现最后一行代码重复多余的,就会将其移除,只传递前4行代码给解释器。...当然,这只是JIT编译器的优化手段之一,不同公司设计的JIT编译器对Java程序的运行会有不同的优化方式。此外需要知道的,JIT编译器并不是每次都会参与到执行过程中来。

29720

用匿名函数定义函数_c语言最先执行的函数

就是函数声明的代码结构: function add(x,y){ alert(x+y) } add(1,2) //弹窗显示:3 复制代码 关于函数声明,它最重要的一个特征就是函数声明提升,意思执行代码之前先读取函数声明...在一个表达式后面加上括号(),该表达式会立即执行,但是在一个语句后面加上括号(),完全不一样的意思,只是分组操作符。...那为什么a =function(){}() 这种表示方法可以让编译器认为这个一个函数表达式而不是一个函数的声明? 3.自执行匿名函数 自执行函数,即定义和调用合为一体。...我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键这种机制不会污染全局对象。...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/107114.html原文链接:https://javaforall.cn

97820

C语言执行效率如何保证?

并且,C语言具有很高的运行效率 那么如何保证C语言执行效率?...在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言效率最高的计算机语言,但是,不可能靠着它 来写一个操作系统吧?...这个例程 典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。 虽然必杀技,但是如果轻易使用会付出惨重的代价。...很多高级语言,包括C++,并不对产生的浮点表达式重新排序,因为那是一个相当复杂的过程。需要注意的,重排序的代码和原来的代码在代码上一致并不等价于计算结果一致,因为浮点操作缺乏精确度。...这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。

6.1K108

java语言c语言一样面向对象的程序设计语言_面向对象和面向过程具体区别

关于面向对象和面向过程网上有一个写的很好的例子来分享给大家 用面向过程的方法写出来的程序一份蛋炒饭,而用面向对象写出来的程序一份盖浇饭。...就是说你用C语言写的代码如果在windows操作系统下编译出来的可执行程序,这个可执行程序不仅可以在你的windows电脑上运行,拿到别人的电脑上,只要是windows操作系统也可以运行;拿着你用C语言写的代码放到...linux操作系统上编译出可执行程序,那这个可执行程序在别人的linux操作系统上也可以运行。...三:效率   说到执行效率由于没有写C语言与Java的起源及发展历程,这里顺带提一句Java语言C语言的基础上开发出来的,Java的很多底层源码都是C语言实现的。...指针直接和计算机内存打交道的东西,这使得C语言执行效率很高,通过指针你几乎可以访问操作计算机的所有内存资源,当然如果使用不当是很危险的。那Java没有指针吗?

59730

C# 如何执行

从编译原理说起 一句话介绍编译器:编译器将用某种程式语言写成的源代码(源语言),转换成另一种程式语言(目标语言)等价形式的程序。...通常我们将某种高级语言(如CC++、C# 、Java)转换成低级语言(汇编语言、机器语言)。...现代编译器还会更复杂,中间会增加更多的处理过程,比如预处理器,中间代码生成,代码优化等。...1527050396_79_w463_h705.jpg 虚拟机是什么 虚拟机(VM),简单理解,就是可以执行特定指令的一种程序。为了执行指令,还需要一些配套的设施,如寄存器、栈等。...C一个语言,微软给它定制了一份语言规范,提供了从开发、编译、部署、执行的完整的一条龙的服务,每隔一段时间会发布一份最新的规范,添加一些新的语言特性。

4.8K113

c语言程序个位,C语言位字段

位字段(bit-field)一个由具有特定数量的位组成的整数变量。结构或联合的成员也可以是位字段。如果连续声明多个小的位字段,编译器会将它们合并成一个机器字(word)。...通常情况下,被分配的内存单元一个 int 类型的机器字。如果紧接着的位字段适合同一内存单元中剩下的空间,那么就被定义到与前面的位字段紧邻的位置。...这段代码以目标机器使用至少 32 位字为前提:struct Date {unsigned int month : 4; // 11月;1212月unsigned int day : 5; // 月份中的日...结构成员 month 的取值范围 0~15;成员 day 的取值范围 0~31;成员 year 的值范围 -2097152~+2097151。...和结构中其他成员所不同的,位字段通常不会占据可寻址的内存位置,因此无法对位字段采用地址运算符(&)或宏 offsetof。

12.2K10
领券