目录

背景:

预处理:

编译:

汇编:

连接:

静态连接:

动态连接:

自动化编程make/makefile:


背景:

我们知道任何一个c语言或者c++文件想要生成一个可执行程序必须完成4个阶段,预处理、编译、汇编、连接。然而平时我们自己编写代码时,在vs环境或者其它编译环境当中并没有感受到这些变化,只感觉自己代码写好了,然后点击编译,程序即可运行,所以对于我们来说从编写文件到可执行文件只有一步的过程,事实上,这其中所有的操作都是我们的编辑器帮助我们完成了,我们也称这类编辑器为集成化编辑器。下面,我就给大家讲解编辑器在哪一步都做了些什么。

预处理:

预处理阶段为我们处理了宏定义、文件包含、条件编译、去注释操作,这样看有些抽象,请看下图。

首先看到我们的一个C语言文件,里面包含了头文件,宏定义,条件编译,还有注释。

在Linux中的生成预编译文件的指令为 gcc -E test.c -o test.i。文件名可以任意取值,保证后缀正确即可。

进入了我们的预编译完成文件之后,进入可以看到我们的#include<stdio.h>在文件中被展开成为了一大推的代码,这里我没有截取完全,里面的东西其实就是我们的库文件包含的内容在我们的机器中所存储了位置,也就是完成了我们的文件包含。

往下翻,找到最后,我们能看到宏定义不见了,全部在代码中被替换,原来主函数中的MAX和MIN都被替换为了100,0,但是在函数中定义的变量num还是保持原样。

里面的注释也全部被清除,其中test函数中的条件编译只保留了满足条件了那一部分,其余部分直接被清除。这些操作分别对应了宏定义、去注释、和条件编译。

编译:

编译过程就是将我们预编译文件转换为汇编语言文件。在这个过程当中就是我们的编辑器检查我们的代码是否规范、是否有语法错误。不过汇编语言我也没学过里面的内容看不懂,只是知道有这么一个过程。

其中部分内容我们还是能勉强阅读,比如有一个主函数main,还有文件名为test.c。

生成编译文件的指令为:gcc -S test.c -o test.s。

汇编:

汇编过程就是将汇编语言转换成为二进制代码,这一过程我们更加看不懂,当然也不需要我们看懂,毕竟这是给机器看的。

生成汇编文件的指令为:gcc -c test.c -o test.o。

连接:

通过使用ldd指令,可以得知我的文件使用了那些其它不是我们编写的文件。接下来我会为大家讲解两种不同的连接方式。

静态连接:

静态连接这一过程很简单,就像是我们与编译过程当中的头文件包含一样,它会将库文件当中的代码拷贝到我们的代码当中来,不过静态连接拷贝的函数是功能函数而不是头文件当中的代码。静态连接有一个很明显的优点就是它再完成连接之后,与库就不在相关联,就算此时删除库文件,我们的代码依旧能够跑过,但是它也有一个很致命的缺点就是,每调用一个函数,他就会拷贝一份,不管之前是否已经拷贝过。

生成一个静态连接代码操作为:gcc test.c -o myfile -static,就是正常的生成可执行文件操作,只不过它需要加上-static指令。

动态连接:

动态连接这一过程我们可以理解为,在我们的文件当中,调用的库文件函数都被转换成为了一个链接,当函数运行到这个位置时,函数会停下,进入链接,这个链接对应的就是库文件在我们电脑当中的位置,程序会运行到库文件当中,调用完成之后就会返回原位置,继续执行。这个操作的优点就是我们的文件数据不会特别的大,因为不用重复的调用同一个函数,或则不断地加入内容进入文件当中。它的缺点就是就算文件编译完成了,该可执行程序同样的依靠我们地库文件才能够实现功能。

编辑器默认生成动态链接文件,操作为:gcc test.c -o myfile。

通过比较上下两张图片,我们可以看到静态链接文件地大小时动态链接文件大小的100倍,差距十分的明显。

自动化编程make/makefile:

自动化编程的出现是因为,这里的每一条指令写起来都很麻烦,而且写错了之后有可能还会将我们的源代码给清除,这是我们很不想看到的,所以才出现了自动化编程make和makefile。

首先我们得通过touch创建一个makefile或者Makefile文件,然后通过vim进入该文件。

其中得myfile是自己命名的可执行文件名,后面的test.c代表需要编译的文件,下方则是需要执行的命令。

.PHONY:clean表示我们的清除操作可以反复执行。clean是自己命名的操作,与下方的clean:对应。

编辑完成之后退出,在命令框中写下make,即可默认执行第一个语句。如果想要执行第二条语句就需要写下make clean,也就是make加上功能。知道了这些,我们就可以写下多个不同的指令。其中的函数编译并不代表只能执行一次,而是可以同时编译多个源文件,只需要写好对应的关系即可。

Linux编辑器-gcc/g++使用相关推荐

  1. 【Linux】Linux编辑器-gcc/g++使用

    目录 一.背景知识 二.gcc是如何完成的 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.链接(生成可执行文件或库文件) 4.1.静态库 4.2.动态库 4.3. ...

  2. 采用 linux+eclipse+gcc g++ 来弄C 的多线程编程

    ---------------------------------------- ================ 对于 C项目的 多线程编程 放弃 windows+mingw+eclipse 采用 ...

  3. Linux下gcc/g++、make和cmake的区别

    文本程序到可执行文件生成无论在什么平台大致分为以下几个部分:  1.用编辑器编写源代码,如.c文件.  2.用编译器编译代码生成目标文件,如.o.  3.用链接器连接目标代码生成可执行文件,如.exe ...

  4. Linux系统安装gcc/g++详细过程

    下载: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2 浏览: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/ ...

  5. 【Linux】gcc/g++

    目录 一.概念 二.语法 三.动/静态库 四.关于文件名后缀问题 一.概念 gcc/g++是linux系统中的编译器,是一款软件.该软件只负责编译,与Windows下的vs系列的差别就是:vs系列是一 ...

  6. Linux编译器-gcc/g++的使用

    ★★★★★ 是小夏啊! 我们知道,当我们用像VS等这样的编译器写完代码后,会通过快捷键操作或是编译器上相应的选项来编译运行,紧接着我们一般通过控制面板来观察程序运行的结果,从而判断自己写的程序代码是否 ...

  7. 【Linux】gcc/g++、gdb的使用

    文章目录 一.前言 二.gcc的基本使用 1. 预处理 2. 编译 3. 汇编 4. 链接 三.函数库 四.gcc常用选项总结 五.gdb的使用 1. 背景知识 2. 基本使用 一.前言 在学习本文前 ...

  8. Linux下gcc/g++编译器gdb调试器和makefile的使用

    文章目录 一.gcc的使用 gcc选项 二.gdb的使用 三.Linux项目自动化构建工具-make/Makefile 3.1 概念 3.2 使用 3.3 原理 一.gcc的使用 首先我们知道一个C/ ...

  9. 【Linux】Linux中gcc/g++的使用

    本期主题:程序的编译过程和gcc/g++的使用 博客主页: 小峰同学 分享小编的在Linux中学习到的知识和遇到的问题 小编的能力有限,出现错误希望大家不吝赐

最新文章

  1. 100个JavaScript代码片段
  2. 华夏基金专访神策数据创始人兼 CEO 桑文锋,金融科技数字化趋势认知传递
  3. SQL 分组使用案例
  4. 0x84bb0001 sqlserver_sqlserver 实现收缩数据库日志操作
  5. LeetCode 2075. 解码斜向换位密码(模拟)
  6. 企业实战_20_MyCat使用HAPpoxy对Mycat负载均衡
  7. gblfy大数据技术之安装CentOS系列
  8. 开源点评:Protocol Buffers介绍
  9. 计算机视觉基础-图像处理(边缘检测)cpp+python
  10. OOP-ECMAScript - 深入理解Javascript
  11. 九宫怎么排列和使用_别人家连客厅茶几都不要了,你却还在纠结挂画怎么挂
  12. python动态变量名以及调用_Python 动态变量名与调用介绍
  13. python读取第一行设为字典_将csv读入字典,第一行成为名称
  14. 【转】for循环中进行Promise异步操作的问题总结
  15. 7,JESD204B接口的关键问题
  16. mysql innodb数据库修复_mysql innodb异常修复
  17. mybatis 大小写 字符串_Mybatis查询时,区分大小写操作
  18. 什么是实例?什么是引用?
  19. 为什么说衰老先从血管开始?
  20. 【YOLO】目标检测第三步——用Pascal voc 2012 数据集训练YOLO网络

热门文章

  1. 大数据医疗面临着哪些挑战?
  2. 大数据应用在医疗行业的5个经典案例
  3. java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串
  4. Apache HAWQ集群的安装部署
  5. AndroidStudio的Gradle完全教程
  6. 使用protractor操作页面元素
  7. 怎么用stata打开dta文件_第三十二章、用c语言打开文件
  8. 马来西亚央行抨击使用误导性Logo的ICO项目
  9. jsp标签与指令总结
  10. 推薦 CSDN 最讓人佩服的專家,袁萌。