正文:

每次我们程序员所写的 代码 是给程序员看的呢?还是给电脑看的?其实我们所写的代码只是我们程序员之间交流的一样特殊语言,电脑是看不懂的。那么我们如何实现人机交流呢?这就不得不请出我们我们今天的主角人机交换的桥梁---编译器,编译器有很多,我们今天介绍的是一种基于 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如何实现代码编译&&汇编&&链接过程的更多相关文章

  1. GCC编译和链接过程

    GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作 ...

  2. C语言预处理 编译 汇编 链接四个阶段

    c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接. 编译过程 编译过程又可以分成两个阶段:编译和会汇编. 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高 ...

  3. <三>从编译器角度理解C++代码编译和链接原理

    1代码 点击查看代码 **sum.cpp** int gdata=10; int sum(int a,int b){ return a+b; } **main.cpp** extern int gda ...

  4. Linux中程序的编译和链接过程

    1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...

  5. C++, Java和C#的编译、链接过程解析

    总是感觉java是解释性语言,转载下一篇感觉写的容易理解的文章 转自 http://www.cnblogs.com/rush/p/3155665.html 1.1.1 摘要 我们知道计算机不能直接理解 ...

  6. gcc 编译 汇编 链接

    要想研究使用 gcc, gcc-multilib 这个包是一定要安装的, 它允许通过 -m32 和 -m64 选项来选择生成 32 位或者 64 的 ELF 文件. 我们知道程序的默认起点是 _sta ...

  7. C/C++程序编译流程(预处理->编译->汇编->链接)

    程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...

  8. 【Linux】【Jenkins】代码编译和执行过程中的问题汇总

    1.问题1:java.io.FileNotFoundException: /root/.jenkins/workspace/Videoyi_AutoTest_Maven/config-log4j\lo ...

  9. Linux - gcc 的简易用法 (编译、参数与链结)

    # 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...

随机推荐

  1. maven 依赖和坐标

    1.maven 坐标由groupId.artifactId.packaging.version.classifier定义.2.classifier 用来帮助定义构建输出的一些附属构件.如,*javad ...

  2. Storm一个executor里运行多个task是为了rebalance

    默认情况下下,一个executor运行一个component,即一个task,但有时会指定多个task: 1 builder.setBolt("", new XxBolt()).s ...

  3. 福大软工1816:Beta(5/7)

    Beta 冲刺 (5/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 组织会议 确定统一界面wxpy.db之 ...

  4. 如何查看Ext自带的API和示例

    Ext是一款富客户端开发框架,它基于JavaScript.HTML和CSS开发而成,无须安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 1.下载地址http://www.sencha.com/p ...

  5. 第八章 SQL高级处理 8-1 窗口函数

    一.什么是窗口函数 窗口函数也称为LOAP函数.OnLine Analytical Processing的简称.意思是对数据库数据进行实时分析处理. 窗口函数就是为实现OLAP而添加的标准SQL功能. ...

  6. teradata 字符串数据合并 在concat()函数无法使用的情况下

    在teradata sql中不存在concat()函数或者stuff()函数,在此情况下,如何实现多条字符串数据合并成一行? 在查找不同方法过程中,在stackflow中找到最简便的方法,使用xml_ ...

  7. MySQL上机实习报告(一)

    一.实习内容    利用wamp进行MySQL上机实习,建立数据库和一个学生信息表,并能对建的表进行数据插入.修改.查询和删除等内容. 二.实习目的 能将课堂上所学的内容运用到实际的上机操作中,进一步 ...

  8. 修改UIView的默认Layer后,修改View的值会动态修改Layer的值

    修改UIView的默认Layer后,修改View的值会动态修改Layer的值 效果图: 如上图所示,当我们修改了一个UIView的子类中的Layer内置类型时(如上图中我们将CALayer直接替换成了 ...

  9. tomcat-7.0.30安装及配置

    使用说明: 一.1.下载jdk(http://java.sun.com/javase/downloads/index.jsp),2.安装jdk-6u14-windows-i586.exe 3.配置环境 ...

  10. Hibernate核心对象

    1.Configuration Configuration 类负责管理Hibernate的配置信息.它包括如下内容: Hibernate运行的底层信息:数据库的URL.用户名.密码.JDBC驱动类,数 ...