• 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, 不用指定.
    • 最后还会为每个可执行文件加一个启动模块, 用于完成程序启动前的准备工作, 如内存空间分配等.
  • 相关阅读:
    SVN安装配置与使用
    ext中对json数据的处理解析
    matlab保存数据
    DLL编程总结
    【MFC 】关于对话框中的OnVScroll() 和 OnHScroll
    OpenCV cvReleaseImage把图像怎么样了?
    [code] if (x<0)x=0;else if (x>255)x=255;
    【DM642学习笔记十】DSP优化记录
    DSP日志打印 LOG_printf
    【MFC】MFC文本框中显示浮点数
  • 原文地址:https://www.cnblogs.com/dengdan890730/p/6217341.html
Copyright © 2020-2023  润新知