GCC是什么

GNU Compiler Collection的缩写,一开始是c语言的编译器,但现今可以支持多种语言的编译工作,也支持了多个硬件平台的编译。总而言之,主流的c语言编译器就是这个gcc了。

这里的GNU是一个软件项目名称,开发了很多的应用程序。

对于.c文件gcc当做c语言处理,g++(是gcc的c++编译器)当做c++处理;对于.cpp文件gcc和g++均当做c++处理;

编译过程

  1. 预处理

    1. 预处理主要解决的是将头文件、宏替换、条件编译给处理掉,include头文件之后,将头文件的代码插入了主代码(处理的.c文件),以及宏的内容给替换在代码文件中,还有将注释给处理掉。.c/cpp文件得到.i文件
  2. 编译分为了编译和汇编两个过程
    1. 编译器:对于c的话是直接gcc,对于c++就是g++;
    2. 编译将源程序进行词法和语法分析后,将高级语言指令转换为了等效的汇编语言,也就是.i文件得到.s文件

      a. 编译预处理,读取c程序,对其中伪指令和特殊符号进行处理

      b. 编译优化处理,将提高效率
    3. 汇编:将汇编语言代码翻译成目标机器指令的过程,也就是.s文件会得到.o文件,得到一目标文件,这里的目标文件包括了两个段,代码段和数据段。
  3. 编译过后还有链接过程
    1. 因为在汇编程序生成的目标文件不能被立刻执行,往往有着很多没解决的问题,有些是文件的函数,存在引用了其他源文件的定义的函数或者是变量,所以就需要链接这个操作,就是将.o文件给链接抽象上聚集在一起,这一步也是为了后面能够生成可执行文件。

.o与.so

一开始不太理解这个东西,在多次问和查询之后,有了点理解

  • .o文件:在linux的ELF分类中,是属于可重定位的对象文件,o文件也是linux享同内的标准可执行文件之一,包括很多内核模块,也会用到这个。
  • so文件,个人理解 so many o,简而言之,是整合链接了多个o文件,就形成了so文件。在linux内,so文件是所谓的动态库文件,也叫可被共享的对下个文件。这个文件的存在可以很好得释放了宝贵得物理内存,就是你要用到某些文件,才会链接去得到它,而不是全部放在linux系统上区占用额外得磁盘空间。

最后再贴下流程图

什么是c/c++编译的更多相关文章

  1. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  2. Centos6.5下编译安装mysql 5.6

    一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...

  3. CENTOS 6.5 平台离线编译安装 PHP5.6.6

    一.下载php源码包 http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror 二.编译 编译之前可能会缺少一些必要的依赖包,加载一个本地yum ...

  4. CENTOS 6.5 平台离线编译安装 Mysql5.6.22

    一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...

  5. Android注解使用之注解编译android-apt如何切换到annotationProcessor

    前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...

  6. Hawk 6. 编译和扩展开发

    Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...

  7. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  8. 在Windows上编译和调试CoreCLR

    生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...

  9. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

  10. Windows下Visual studio 2013 编译 Audacity

    编译的Audacity版本为2.1.2,由于实在windows下编译,其源代码可以从Github上取得 git clone https://github.com/audacity/audacity. ...

随机推荐

  1. Onedrive分享型网盘搭建 - OneManager

    注册账号 部署OneManager 注册完账号后打开网址:https://heroku.com/deploy?template=https://github.com/qkqpttgf/OneManag ...

  2. javascript 通信协议

    简介 javascript 通信协议是一个伪协议[1], 用于指定 URL 为 JavaScript 代码 语法: javascript:someScript; someScript 是一个或多个使用 ...

  3. jenkins集群(二)(master --> slave) -- allure自动化测试报告部署

    一.前提 1.环境 1)已经部署好了jenkins环境,包括jenkins的“全局工具配置”也配好了. 2.master与slave的简单的概念 1)master:jenkins部署所在的机器 2)s ...

  4. Flask前后端分离项目案例

    简介 学习慕课课程,Flask前后端分离API后台接口的实现demo,前端可以接入小程序,暂时已经完成后台API基础架构,使用postman调试. git 重构部分: token校验模块 auths认 ...

  5. three.js 对象绕任意轴旋转--模拟门转动

    说了几篇的数学方法,这篇放松一下,郭先生说说绕任意轴转动.说一说其中一种方法,也是比较容易理解的一种,它的原理就是将子对象放到一个盒子中,然后改变子对象相对于父对象的位置(因为子对象的原点默认还是在盒 ...

  6. 做完这套面试题,你才敢说懂Excel

    下面的题目来自一份商品专员的面试题,其中有涉及到条件格式.自定义排序.数据验证制作下拉菜单.查找引用类函数.文本提取函数等等技能. 满满的干货技能可不是商品专员“专属”,如果你能熟练掌握,在平日工作中 ...

  7. 环境篇:DolphinScheduler-1.3.1安装部署及使用技巧

    环境篇:DolphinScheduler-1.3.1安装部署 1 配置jdk JDK百度网盘:https://pan.baidu.com/s/1og3mfefJrwl1QGZGZDZ8Sw 提取码:t ...

  8. PHP print_r() 函数

    print_r() 函数用于打印变量,以更容易理解的形式展示. PHP 版本要求: PHP 4, PHP 5, PHP 7高佣联盟 www.cgewang.com 语法 bool print_r ( ...

  9. PHP is_bool() 函数

    is_bool() 函数用于检测变量是否是布尔型.高佣联盟 www.cgewang.com PHP 版本要求:PHP 4, PHP 5, PHP 7 语法 bool is_bool ( mixed $ ...

  10. PHP quotemeta() 函数

    实例 在预定义的字符前添加反斜杠: <?php高佣联盟 www.cgewang.com$str = "Hello world. (can you hear me?)";ech ...