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

    预处理(Preprocess).

    使用Preprocessor Directives将一些代码替换成另一些代码. 例如将include替换成它指向的文件包含的代码.

    编译成目标文件(Compiation).

    需要两个回合(pass):

    1. 将代码解析成树(parse tree). 这个过程中还会执行类型检查.
    2. 将parse tree 转换成object文件. 可以先转换成汇编文件, 然后机器码文件.

    链接(link)

    将obj文件link可执行文件. 检查目标文件中用到的变量与函数是否存在. 它们可以存在于单个或多个obj文件中, 也可存在于library文件, 如.so中.
    当linker碰到一个声明时, 有两种情况, 对应两种处理:

    1. 如果之前已经解析过, 万事OK. (具体情况不了解)
    2. 如果没有解析过, 则在系统路径和用户提供的路径中寻找. 编译好的库文件有索引, 所以不用search整个文件, 只需要在索引中search就行. 找到后, 将定义所在的模块, 即整个obj文件而非整个库文件链接到可执行文件中.

    需要注意的是:

    • 编译时一般会自动执行链接过程, 可以提供额外的include路径(具体是哪个参数TODO).
    • 标准库文件的路径,如iostream, 不用指定.
    • 最后还会为每个可执行文件加一个启动模块, 用于完成程序启动前的准备工作, 如内存空间分配等.
  • 相关阅读:
    java线程的理解
    linux常用命令
    排序算法-(2)-选择排序
    git查看某个文件修改历史
    Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
    排序算法-(1)-插入排序
    去重脚本
    771.宝石与石头
    json 的应用
    xml 文件处理
  • 原文地址:https://www.cnblogs.com/dengdan890730/p/6217341.html
Copyright © 2011-2022 走看看