zoukankan      html  css  js  c++  java
  • 什么是c/c++编译

    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系统上区占用额外得磁盘空间。

    最后再贴下流程图

  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/yhycoder/p/13500792.html
Copyright © 2011-2022 走看看