编译和链接

image

编译器的工作不单单只有编译,事实上,它包括了从高级语言到机器语言的完整过程:
预编译-》编译-》汇编-》链接。

  1. 预编译
    预编译过程主要是处理源代码文件中以#开始的预编译指令。主要处理规则如下:
    1.1.将所有#define删除,并展开所有的宏定义。
    1.2.处理所有条件编译指令,比如#ifdef、#else等。
    1.3.处理#include,递归的将被包含的文件出入到该指令的位置。
    1.4.删除所有注释。
    1.5.添加行号和文件名标识,以便于编译器调试产生的行号消息和警告时显示的行号。
    1.6.保留所有#pragma编译指令。#pragma指令是编译器参数。经过预编译之后,产生一个*.i文件。
  2. 编译
    编译过程就是把预处理完成的*.i文件进行词法分析、语法分析、语义分析以及优化之后,产生相应的汇编代码文件。
    2.1.词法分析利用扫描器和有限状态机算法,将源代码字符按照特定的字符标识分割成一系列记号。这些记号包含了以下几种分类:关键字、标识符、字面量(包括数字、字符串等)和特殊符号(加减乘除等)。
    2.2.语法分析产生表达式语法树,但是不排查这个语句是否合法。
    2.3.语义分析给语法树添加类型标识,并检查表达式是否合法。
    2.4.中间代码生成。
    2.5.目标代码生成和优化经过编译之后,产生一个汇编输出文件*.s文件。
  3. 汇编
    汇编过程就是将汇编代码转变成机器代码文件*.o文件。这是个相对简单的过程,根据汇编指令和机器指令对照一一翻译就可以了。
  4. 链接
    连接器将多个*.o文件彼此关联拼接到一起,最终产生一个可执行文件。分为静态链接和动态链接。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++ 开发中,我们通常使用多个文件来编写大型程序,这使得代码更可维护且易于扩展。然而,当我们需要将这些文件组合在一起构建项目时,我们需要了解如何进行编译链接。 C++ 文件分为头文件和源文件。头文件通常包含类、函数和变量的声明,而源文件包含它们的实现。当一个源文件需要访问另一个源文件中的某些内容时,我们需要在头文件中声明它们,并在源文件中包含这些头文件。 下面是一个包含两个源文件的例子:main.cpp 和 myfunc.cpp。 main.cpp 包含一个 main() 函数,myfunc.cpp 包含一个名为 myfunc() 的函数。我们将在 main.cpp 中调用 myfunc()。 main.cpp: ```cpp #include <iostream> #include "myfunc.h" int main() { std::cout << myfunc() << std::endl; return 0; } ``` myfunc.cpp: ```cpp #include "myfunc.h" int myfunc() { return 42; } ``` myfunc.h: ```cpp #ifndef MYFUNC_H #define MYFUNC_H int myfunc(); #endif ``` 在上面的代码中,头文件 myfunc.h 包含了 myfunc() 函数的声明,在 main.cpp 中通过 #include "myfunc.h" 包含了这个头文件,使得 main.cpp 知道了 myfunc() 函数的存在。 接下来,我们需要编译链接这两个源文件,生成可执行文件。编译器将源文件转换为目标文件,并将目标文件链接成一个可执行文件。 我们需要使用以下步骤进行编译链接: 1. 将每个源文件编译成目标文件。在命令行中,我们可以使用以下命令来编译两个源文件: ``` g++ -c main.cpp -o main.o g++ -c myfunc.cpp -o myfunc.o ``` 上面的命令将 main.cpp 编译成 main.o 目标文件,将 myfunc.cpp 编译成 myfunc.o 目标文件。这些目标文件包含了源文件中定义的函数和变量的实现。 2. 将所有目标文件链接在一起,生成可执行文件。在命令行中,我们可以使用以下命令来链接两个目标文件: ``` g++ main.o myfunc.o -o myapp ``` 上面的命令将 main.o 和 myfunc.o 目标文件链接起来,生成一个名为 myapp 的可执行文件。 这样,我们就完成了 C++ 多文件编译链接的过程。在实际开发中,我们通常使用构建工具来自动化这些步骤,例如 Makefile 和 CMake。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值