zoukankan      html  css  js  c++  java
  • 程序员的自我修养-编译和链接

    1. 预编译:主要处理源文件中的以#开始的预编译指令。 (经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中)

    • 将所有的#define删除,并且展开所有的宏定义
    • 处理所有条件预编译指令,比如:#if,#ifdef
    • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置
    • 删除所有注释
    • 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误信息或告警时能显示行号
    • 保留所有的#pragma编译器指令,以为编译器需要使用它们。

    2. 编译:编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。

    3. 汇编:汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。所以汇编过程相对比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了。

    4. 链接:在一个程序被分割成多个模块以后,这些模块之间如何组合成一个单一的程序是需要解决的一个问题。模块之间如何组合的问题可以归结为模块之间如何通信的问题,最常见的属于静态语言的C/C++,模块之间通信有两种方式,一种是模块间的函数调用,另外一种是模块间的变量访问。函数访问需要知道目标函数的地址,变量访问也需要知道目标变量的地址所以这两种方式可以归结为模块间符号的引用。这个模块的拼接过程就是连接。

    其实链接器就是把一些指令对其他符号地址的引用加以修正。链接过程蛀牙包括地址和空间分配,符号决议和重定位等

  • 相关阅读:
    嵌入式驱动开发之sensor---sensor 图形传感器调试
    时下世界上最先进的液晶面板技术---ips
    多媒体开发之rtp 打包发流---udp 丢包问题
    多媒体开发之rtp 打包发流---同网段其他机子sdp 播放不了
    AutoCAD LoadLibrary Failed with error 126 Message
    OpenCV获取与设置像素点的值的几个方法
    四元数与旋转
    圆点博士小四轴主程序状态机结构
    四元数(Quaternion)和旋转 +欧拉角
    PID控制算法
  • 原文地址:https://www.cnblogs.com/java-cjt/p/4448848.html
Copyright © 2011-2022 走看看