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. Pull后产生多余的log(Merge branch 'master' of ...)

    第一步: git reset --hard 73d0d18425ae55195068d39b3304303ac43b521a 第二步: git push -f origin feature/PAC_1 ...

  2. 细说websocket快速重连机制

    文|马莹莹 网易智慧企业web前端开发工程师 引言 在一个完善的即时通讯应用中,websocket是极其关键的一环,它为web应用的客户端和服务端提供了一种全双工的通信机制,但由于它本身以及其底层依赖 ...

  3. 大数据篇:一文读懂@数据仓库(PPT文字版)

    大数据篇:一文读懂@数据仓库 1 网络词汇总结 1.1 数据中台 数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念. 数据中台是一套可持续"让企业的数据用起 ...

  4. 服务器入侵应急响应排查(Linux篇)

    总体思路 确认问题与系统现象 → 取证清除与影响评估 → 系统加固 → 复盘整改 常见入侵 ① 挖矿: 表象:CPU增高.可疑定时任务.外联矿池IP. 告警:威胁情报(主要).Hids.蜜罐(挖矿扩散 ...

  5. pdb 进行调试

    import pdb a = 'aaa' pdb.set_trace( ) b = 'bbb' c = 'ccc' final = a+b+c print(final) import pdb a = ...

  6. Python List len()方法

    描述 len() 方法返回列表元素个数.高佣联盟 www.cgewang.com 语法 len()方法语法: len(list) 参数 list -- 要计算元素个数的列表. 返回值 返回列表元素个数 ...

  7. PHP atanh() 函数

    实例 返回不同数的反双曲正切: <?phpecho(atanh(M_PI_4) . "<br>");echo(atanh(0.50) . "<br ...

  8. Skill 解决 Design Library 被识别成 Technology Library 的问题

    https://www.cnblogs.com/yeungchie/ code procedure(ycTechLibToDesign(libName attachLibName) prog((lib ...

  9. luogu P4852 yyf hates choukapai 单调队列优化dp

    LINK:yyf hates choukapai 由于赶时间 要做的题有点小多.. 所以简略概述一下. 容易想到一个暴力dp \(f_{i,j,k}\)表示到了第i张牌此时连抽j次已经单抽k次的最大值 ...

  10. js的栈内存和堆内存

    栈内存和堆内存在了解一门语言底层数据结构上,挺重要的,做了个总结 JS中的栈内存堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象, ...