Linux | GCC如何实现代码编译&&汇编&&链接过程
正文:
每次我们程序员所写的 代码 是给程序员看的呢?还是给电脑看的?其实我们所写的代码只是我们程序员之间交流的一样特殊语言,电脑是看不懂的。那么我们如何实现人机交流呢?这就不得不请出我们我们今天的主角人机交换的桥梁---编译器,编译器有很多,我们今天介绍的是一种基于 Linux 系统的 GCC 编译器,以下代码都是在 Linux 系统上 VI 编辑器代码 GCC 编译代码实现的。
1、GCC概述
通常我们所写的代码无论 C \ C++ 等一些高级语言其实电脑是识别不了的。代码只是我们程序员人与人之间交流的一种特殊语言 ,GCC 起初的全名是 GUN C Comlier 通俗的来说 GCC 编译器就好比是翻译官,把我们程序员写的代码翻译成电脑识别的机器语言。随着 GCC 编译器的功能不断强大,支持的语言越来越多,他的名称就变成了 GUN Comlier Collection 也称编译组织,里面包含了许多的“ 工作成员 ”,接下来我们就来看看 GCC 编译器里的成员( 编译、汇编、链接 )是怎么分工合作实现人机交互编译的。
2、编译
什么是编译?我们通过在Linux终端创建一个 点C 文件, 输入「gcc -v -o test1 test_1.c」打开文件我们可以看到一堆的英文,

先别慌,不要觉得看不懂,我们只看有用的重点,看到白色背景的方框我们可以看见,所谓编译就是「/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o xxx.s test_1.c」里 cc1 把我们的 .C 输入文件编译成 xxx.S 的输出文件

是不是我们每次编译都要输入这么一大段的文字呢?不用,我们只要用简洁的办法「gcc -S」( S是大写的 )这个命令等价于上面的那一段字母命令来输出就可以。这样就得到一个 xxx.s 的输出文件,代码如下图:

这个还是我们程序员之间交流的另一种语言(汇编语言),但是这样的文件计算机还是不认识,所以我们还的继续下一步。
3、汇编
所谓汇编就是把上面的 .s 作为输入文件从而得到 .o 输出文件,我们同样也可以用简便的命令「gcc -c」可以得到,其实这个命令是间接的调用实现把 .c 编到 .s 再到 .o这么一个过程,也就是「gcc -c」就是会主动的先实现编译再汇编,这个时候代码已经编译成二进制文件了,如下图:

哈哈哈···是不是看不懂?看不懂就对了,这是给电脑看的,但是这时候我们编译得到一个 .o 文件,好比一个组合机器人一样,我们需要把一堆的器件连接起来,才能成为一个完整的机器,所以这个时候我们需要调用链接器来吧所有的文件都连接起来。
4、链接
什么是链接?直接看图:

如图我们可以看到,我们需要的计算机能识别运行的文件名 test1 是由「/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o test1 xxx.o」编译出来,但是从图中我们还可以看出,后面的 .o 文件不止一个,而是一堆,为什么会有一堆呢?明明我们只是编译了一个。其实我们不用去管这一堆文件有多少什么个每一个是什么意思,我们找到我们编译的哪一个 test1.o 文件。我们要记住的一点就是,我们可以通过链接来让我们上面 编译、汇编出来的文件和其他库文件连起来才能使 test1 文件运行,所以最终我们得到的计算机能识别运行的文件是 test1 文件,这就大功告成了。同样的,上面的命令太长了我们用一个简便「gcc -o」的命令来替代。
我们用 VI 编辑器写一个C语言输出 「hello world」的代码如图:

然后通过「 gcc -o test1 test_1.c」命令编译实现人机交互,代码如图:

其实 GCC 就像是一个集合,作为翻译组织来调用不同工具来为他服务从而实现了人机交换的语言编译器。由于GCC是非常智能人性化的,很多事情都给我省了。我们写完代码没必要按照上面复杂的步骤来实现编译,我们只要通过一个『 gcc -o 【输出文件名】 【输入的 .c 文件 】』一条命令就可以一步实现人机交互。
注意:gcc 编译对文件后缀名很敏感,如果是编译 C 语言必须是以 .c 为后缀的。
======================(完)===================
Linux | GCC如何实现代码编译&&汇编&&链接过程的更多相关文章
- GCC编译和链接过程
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作 ...
- C语言预处理 编译 汇编 链接四个阶段
c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接. 编译过程 编译过程又可以分成两个阶段:编译和会汇编. 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高 ...
- <三>从编译器角度理解C++代码编译和链接原理
1代码 点击查看代码 **sum.cpp** int gdata=10; int sum(int a,int b){ return a+b; } **main.cpp** extern int gda ...
- Linux中程序的编译和链接过程
1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...
- C++, Java和C#的编译、链接过程解析
总是感觉java是解释性语言,转载下一篇感觉写的容易理解的文章 转自 http://www.cnblogs.com/rush/p/3155665.html 1.1.1 摘要 我们知道计算机不能直接理解 ...
- gcc 编译 汇编 链接
要想研究使用 gcc, gcc-multilib 这个包是一定要安装的, 它允许通过 -m32 和 -m64 选项来选择生成 32 位或者 64 的 ELF 文件. 我们知道程序的默认起点是 _sta ...
- C/C++程序编译流程(预处理->编译->汇编->链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...
- 【Linux】【Jenkins】代码编译和执行过程中的问题汇总
1.问题1:java.io.FileNotFoundException: /root/.jenkins/workspace/Videoyi_AutoTest_Maven/config-log4j\lo ...
- Linux - gcc 的简易用法 (编译、参数与链结)
# 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...
随机推荐
- docker实战 (1) 关于docker的安装
docker定义: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...
- C#秒转换小时
#region 秒转换小时 SecondToHour /// <summary> /// 秒转换小时 /// </summary> /// <param name=&qu ...
- MongoDB学习笔记(一)——Windows 下安装MongoDB
首先从官网下载mongodb的windows安装包,根据自己系统类型选择32位或者64位版本安装即可,然后根据提示一路下一步即可安装完成.如果没有修改安装目录会默认安装在C:\Program Fil ...
- css.map作用
看一段sass代码: 嵌套书写的结构在sass中经常会被用到. 编译之后的样式是这样的: 在开发工具上我们看到的是编译后的文件,而非编译前的源文件. 这个时候就产生一个问题了.在生产环境中,我希望看到 ...
- Oracle EBS 清理归档
oraprod 登陆数据库服务器 执行 rman target / 如图: 执行: delete noprompt force archivelog all completed before ‘sys ...
- java多线程读取、操作List集合
import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.ArrayUtils; pub ...
- Oracle案例10——HWM(高水位线)性能优化
最近BI同事反馈说一张表的数据查询非常慢,这个表数据总共不到1W行数据,这么一说我们首先想到的是高水位带来的性能问题,即高水位线下占用过多数据块,而这些数据块其实是部分数据占用,大多数是空闲的数据块. ...
- Mybatis工作原理(含部分源码)
MyBatis的初始化 1.读取配置文件,形成InputStream String resource = "mybatis.xml"; // 加载mybatis的配置文件(它也加载 ...
- word 排版用到双直线、波浪线、虚线 、直线、隔行线等技巧
在办公或毕业设计时,有时排版需要插入双直线.波浪线.虚线 .直线.隔行线等而烦恼, 今天小白与大家分享技巧如下: 感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮.本文欢迎各位转载,但 ...
- eclipse 调试技巧收集
1 eclipse启动tomcat无法访问 原因:部署路径没有选择 tomcat安装路径 解决:双击,设置server location即可 http://blog.csdn.net/wqjsir/ ...