首页 > 编程语言 >C/C++编译器构成

C/C++编译器构成

时间:2023-03-08 16:22:19浏览次数:45  
标签:文件 ++ C++ 编译 编译器 cpp main 构成

C/C++编译器构成

C/C++编译器有 4 个基本组成部分:预处理器、编译器、汇编器和链接器,它们功能大致如下:

一般我们说编译器是指整套工具链,与其中一个组成部分重名。

  1. 预处理器 cpp:处理以 # 开头的行,将所需库代码插入源程序,进行宏替换等等。
  2. 编译器 ccl:进行语法检查,若语法无误则将源代码翻译成汇编代码。
  3. 汇编器 as:将汇编代码翻译成机器指令,并将这些指令打包成可重定位目标文件。
  4. 链接器 ld:将所有可重定位目标文件与必需的库一起链接生成可执行目标文件。

image-20230308102646186

在编写 C/C++ 程序时,遇到的错误按时期可以划分为 3 类:

  1. 编译期间语法错误;
  2. 链接期间找到对应的静态库或动态库;
  3. 运行时错误。

相较而言,遇到编译期间语法错误最幸运,可以根据错误信息修改程序。

链接错误比较头疼,文件编译顺序错误,或者没有指定库路径,或者路径打错了,或者路径不存在,最玄学的还是路径正确库也存在,但就是编译不过,哈哈哈。

运行时错误最头疼,因为程序遇到这个错误一般都会崩溃而停止运行。我们写个人代码程序遇到这样的错误不需要慌张,插桩法,打断点,继承了调试功能的 IDE 都能提供帮助。可是,如果大公司的服务遇到运行时错误而终止了,“我一分钟几百万上下”这话就不是吹牛的了,那将会造成极大的经济损失,同时公司名誉受损。总之关于运行时错误如何查找诱因、如何规避、如何恢复是一门学问,我知之甚少。

实践演练

通过编译一个 main.cpp 文件观察整个流程。

#include <iostream>

using namespace std;

void test() 
{
    cout << "111" << endl;
}

int main()
{
    printf("%x\n", test);
    printf("%x\n", &test);
    return 0;
}

我们不必记住每个组件的名称,只需要用 gcc(C++是g++)这个集成工具,通过指定选项就可以调用每个组件,如下表格所示。

选项 作用 例子
-E 只进行预处理,得到 .i 文件 gcc -E xxx -o yyy.i
-S 只进行预处理和编译,得到 .s 文件 gcc -S xxx -o yyy.s
-c 只进行预处理、编译和汇编,得到 .o 文件 gcc -c xxx -o yyy.o

当然如果要生成最终的可执行文件,就不带任何选项,如 gcc xxx -o run

  1. 预处理:g++ -E main.cpp -o main.i,本来 15 行的代码,得到的 .i 文件有 26010 行。

image-20230308101103713

  1. 编译:g++ -S main.i -o main.s,当然也可以直接对 .cpp 文件进行g++ -S main.cpp -o main.s,编译器自动完成了之前阶段的工作,结果是一样的,但是只有 181 行。

image-20230308101149163

  1. 汇编:g++ -c main.s -o main.o,当然也可以直接对 .cpp 文件进行g++ -c main.cpp -o main.o,编译器自动完成了之前阶段的工作,结果是一样的,此时生成的 .o 文件是二进制文件,不可以查看内容。

image-20230308101518405

  1. 链接:g++ main.o -o main,当然也可以直接对 .cpp 文件进行g++ -c main.cpp -o main.o,编译器自动完成了之前阶段的工作,结果是一样的,此时生成的文件是二进制文件,不可以查看内容,但是可以直接执行./main

标签:文件,++,C++,编译,编译器,cpp,main,构成
From: https://www.cnblogs.com/zwjason/p/17192454.html

相关文章

  • C++ 性能反向优化——用哈希表消除if else导致的性能降低。
    从代码整洁的角度考虑,对于不同的值将调用相同参数的不同函数,我们通常可以通过建立从值到对应函数指针的哈希表,从而将ifelse消除。但实际可能使性能更低,以下是测试例子。......
  • C++ 基础
    基础程序语言分为低级语言(机器语言、汇编语言)中级语言高级语言(C、C++等)。C++语言的主要特点兼容C语言面向对象(继承和多态)引进了类和对象的概念C++的基本......
  • C++自定义比较函数的bug
    autocmp=[](intx,inty){returntrue;};priority_queue<int,vector<int>,cmp>q;报错第三个参数失配,需要一个类型,而不是对象。平时用sort直接传cmp习惯了,才发......
  • ℬ悟透C++┇Puzzle记录
    C++Puzzles★1.有如下代码,问:ptr指向了谁?能通过ptr调用Derived类重写的函数吗(即多态还起作用吗)?dynamic_cast到底是什么作用?ptr2与ptr性质是一样的吗?Derived*derived=ne......
  • 大数科学计算器 C++
    大数计算器目录大数计算器优点实现思路自定义类MyNum类★★★Method类具体函数实现MyNum类的函数构造&三大函数数学函数转换函数运算符重载显示函数Method类的函数构......
  • C++ primer StrBlobPtr和StrBlobPtr
    1#include<iostream>2#include<stdio.h>3#include<string>4#include<memory>5#include<algorithm>6#include<initializer_list>7#inclu......
  • C++11 thread_local关键字
    这是一篇科普文--关于thread_local关键字首先,C++11之前并没有对并发进行任何的支持,C++11首次提供了以下的支持:语言核心定义了一个内存模型,保证当更改"被两个不同线程使......
  • 第一个C程序:如何在DevC++中编辑、编译和运行程序
    第一步:打开DevC++程序,选择文件——新建——源代码 第二步:保证输入法在英文状态下输入代码 第三步:保存文件,保存的时候选择.c文件格式 保存完之后*号消失 ......
  • C/C++课程设计题目及具体要求[2023-03-07]
    C/C++课程设计题目及具体要求[2023-03-07]三、课程设计题目及具体要求:(1)学生成绩管理程序要求:本程序用于教学单位(院/系)的学生成绩管理。要求程序能够实现学生信息......
  • [Effective] 1 让自己习惯 C++
    1让自己习惯C++条款01:视C++为一个语言联邦C++可以认为由4个次级语言组合而成:C是C++的语法基础;Object-orientedC++实现面向对象设计;TemplateC++实现泛型编......