【C语言入门学习笔记】如何把C语言程序变成可执行文件!
环境
在ANSI的任何一种实现中,存在两种不同的环境。
翻译环境:在这个环境里,源代码被转换为可执行的机器指令。
执行环境:用于实际执行代码。
翻译环境
组成一个程序的每个源文件通过编译过程分别转成目标代码
各个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。
链接器同时也会引入标准c函数库中的任何被改程序所用到的函数。
过程如下图所示
实际上,翻译环境本身也有几个阶段组成:
编译
预编译阶段:在这个阶段主要进行一些文本操作,如处理预处理指令,删除注释,#define宏替换,条件编译。
我们可以在linux平台下测试一下,在这个阶段会产生一个.i文件。
首先写一个简单的程序,比如hello world,保存为test.c文件。
使用如下代码:
gcc -E test.c -o test.i
此时会出现一个test.i文件,vim打开可以观察到里面的代码已经不再是原来的hello world了,这一步会将#include包含的文件全部复制过来。
编译阶段
主要对代码进行解析,分析出语法错误词法错误,并且符号汇总。这一阶段完成后会形成.s文件,并且将c代码转成汇编语言。
使用如下代码:
gcc -S test.i -o test.s
打开可以观察到:都是汇编代码。
汇编阶段
在这一阶段,会形成符号表。并且将汇编代码转换成机器指令,二进制序列。
使用如下代码
gcc -c test.s -o test.o
打开可以看到,全部都是一些我们看不懂的东西,其实就是二进制序列。
链接
链接这一阶段主要是合并段表,合并符号表和对符号表的重定位。
编译阶段结束后,会生成一个a.out的文件,这个就是我们说的可执行程序,中间产生的.i .s .o文件会被自动删除(可使用代码保留)。
./a.out
此时可以看到屏幕上已经打印了hello world了。
执行环境
首先,程序必须载入内存,这个任务由操作系统完成。在独立环境中,必须手工安排,比如通过把可执行代码置入只读内存(ROM)来完成。
接着,调用main函数。
执行程序代码,程序将使用一个运行时堆栈,用于存储函数的局部变量和返回地址,程序同时也可以使用静态内存,存储于静态内存中的变量在整个执行过程中将一直保留他们的值。
终止程序。可以是正常终止,也可能是出现错误自行中断。
如果你也想学编程,可以来我的C语言/C++编程学习基地【点击进入】!
还有免费的(源码,零基础教程,项目实战教学视频)!
涉及:游戏开发、课程设计、常用软件开发、编程基础知识、黑客等等...
【C语言入门学习笔记】如何把C语言程序变成可执行文件!的更多相关文章
- R语言入门学习笔记 - 对R软件的认识
一.R软件 1.安装R:自行百度☺ 2.R控制台(R Console)和R程序脚本: 打开R软件,就会直接打开控制台,控制台可以显示程序运行的结果.错误提示等信息,也可以直接输入想要执行的操作并立即返 ...
- Scala入门学习笔记三--数组使用
前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- Sass简单、快速上手_Sass快速入门学习笔记总结
Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
随机推荐
- python pickle库
一.简介: 将文本信息转变为二进制数据流存储在一个文件中,便于下次使用. 二.常用函数: dump(object, file, protocol=None) 必填参数 obj 表示将要封装的对象 必填 ...
- linux:apache-配置基于域名的虚拟机主机
一个http服务要配置多个站点,就需要用到虚拟机主机. 虚拟机主机一般有三类:1.基于域名 2.基于端口 3.基于ip 举例操作基于域名配置三个站点: 域名 站点目录 www.eejind.com ...
- Unity3D与iOS的交互
1. 关于Unity3D Unity3D(以下简称U3D)是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开 ...
- 使用 usbmon 抓取 usb 总线上的数据
使用 usbmon 抓取 usb 总线上的数据 usbmon 即 usb monitor,是 linux 内置的 usb 抓包工具.usbmon 本质是一个内核模块,在我的 ubuntu14.0 4中 ...
- 深度神经网络conda环境下载
介绍 因为使用conda下载数据有时候因为网络问题下载非常慢,因此我把conda的环境备份好,到时可以直接使用conda的conda create -n 新环境名字 –clone 环境的路径 , 直接 ...
- 【JAVA】mysql数据库常见知识点
目录 1.事务四大特性 2.数据库隔离等级 3.Mysql两种存储引擎的区别 4.哈希索引和B+树索引 5.聚簇索引和非聚簇索引 6.索引的优缺点,什么时候使用索引,什么时候不能使用索引 7.索引的底 ...
- Redis学习(一)认识并安装redis
一.初识redis Redis是一个开源的Key-Value数据库,通常被称为数据结构服务器,其值可以是多种常见的数据格式,且读写性能极高,且所有操作都是原子性的. Redis是运行在内存中的,但是可 ...
- Java Web学习(三)数据加密方式详解
一.对称加密 定义:加密和解密使用相同密钥的算法. 常见的有DES.3DES.AES.PBE等加密算法,这几种算法安全性依次是逐渐增强的. DES加密 特点:简便.密钥长度比较短. import ja ...
- 获取NX装配结构信息
最近在做一个项目,需要获取NX装配结构信息,这里把代码分享给大家,希望对各位有帮助,注意以下几点: 1)代码获取了PART的属性.表达式等,因此一些细节可能需要您根据实际情况修改. 2)读写XML用的 ...
- redis 的基本使用
Linux上查看redis是否运行 ps -ef | grep redis 还能查看到Linux的安装路径. set rediskey redisvalue 在redis里面存储了一个名称为r ...