zoukankan      html  css  js  c++  java
  • C/C++编译过程

    在学习C++过程中,遇到了头文件为什么最好是包含.h类型,而不是cpp类型的问题。在寻找结果的过程过,发现是跟语言的编译过程有关,借此机会学习一下C/C++的编译过程

    目的就是:将高级语言转换成二进制语言,供计算机执行;

    过程

    1.预处理

    替换代码中的头文件,宏定义,去除代码注释

    gcc -E text.cpp -o text.i   -E:预处理完成后终止编译进行
    

    2.编译

    此过程中会将预处理之后的代码,翻译特定的汇编代码,通常情况下,当编译器报错语法错误时,就是在这个过程中。

    gcc -S text.cpp -o text.i   -S:编译完成后终止编译进行
    

    3.汇编

    显而易见,就是把上一步转换到的汇编代码,翻译成机器语言

    gcc -c text.cpp -o text.o   -c:汇编完成后终止编译进行
    

    4.链接

    在C/C++中,一定少不了对头文件的引用,当编译器把自己的cpp编译以后,还会链接到cpp中的头文件所对应的,obj文件,如此以来,整个程序才被编译成了可执行文件。

    附表:

    文件扩展名 文件类型
    .c C语言代码
    .C、.cc、.cpp C++语言代码
    .i 预处理后的C语言代码
    .s、.S 汇编语言代码
    .o 目标代码
    .a 静态链接库(程序编译时使用)
    .so 动态链接库(程序运行时使用

    回到上面的问题:

    Q:为什么最好是包含.h类型,而不是cpp类型的问题?

    A:当我们的头文件是cpp文件时,有如下弊端:

    • 当代码文件进行修改后,整个项目都需要重新编译,而当头文件是.h的时候,尽管修改了源代码,但是编译的还是那些代码量,不会在对头文件进行重新编译,之后直接就将编译出来的obj文件,与头文件对应的lib文件进行结合即可。(当整个项目不是很大的时候,二者没有太大的区别,但是当项目大时,这种优势就会很明显了)
    • 当以.h为头文件时,我们就可以很容易的实现库的传播,又能保证代码的闭源。

    include <.cpp> 对***.cpp文件重新编译,之后将二者连接 。**

    #include<.h> 对.h对应的文件名实现连接。*

    参考链接:

    编译器的工作过程

    C语言编译过程详解

    C/C++程序编译过程详解

  • 相关阅读:
    手机评測怎么看?
    【c++】简单的string类的几个基本函数
    免费软件怎样赚钱?
    【leetcode】Swap Nodes in Pairs (middle)
    【leetcode】Divide Two Integers (middle)☆
    【leetcode】4Sum(middle)
    【leetcode】Longest Common Prefix (easy)
    【leetcode】3Sum Closest(middle)
    【leetcode】Container With Most Water(middle)
    【leetcode】Palindrome Number (easy)
  • 原文地址:https://www.cnblogs.com/ymyguang/p/12856403.html
Copyright © 2011-2022 走看看