跳转至

C++ 编译基础

654 个字 31 行代码 预计阅读时间 3 分钟

为什么 C++ 需要编译?

C++ 是一种高级编程语言,它提供了丰富的特性来帮助开发者编写高效、灵活的程序。然而,计算机硬件只能理解和执行机器语言指令,即二进制代码。C++ 代码是人类可读的文本形式,需要转换成机器可执行的格式。这个过程就是编译。

编译器是将 C++ 源代码转换成机器代码的软件工具。编译过程确保了代码的语法正确性、类型安全,并且优化了代码以提高执行效率。

编译流程

下面以g++编译hello.cpp文件为例,介绍编译的流程。

常见的 C/C++ 编译器

常见的 C/C++ 编译器主要有以下两种

  • GCC(GNU Compiler Collection)是一个开源的编译器集合,支持多种编程语言,包括 C C++
    • gcc 用于 C 语言的编译
    • g++ 用于 C++ 的编译(兼容 C 语言的编译)
  • LLVM(Low Level Virtual Machine)是一个开源的编译器基础设施项目,由一系列的模块化和可重用的编译器组件构成,支持广泛的编程语言,包括但不限于 C、C++。
    • clang 用于 C 语言的编译
    • clang++ 用于 C++ 的编译(兼容 C 语言的编译)
  1. 预处理阶段(Preprocessing)

    • 移除注释。
    • 处理预处理指令,如#include和宏定义,生成预处理文件 (.i)
    g++ –E hello.cpp –o hello.i
    
  2. 编译阶段(Compilation)

    • 将预处理后的代码转换成汇编语言,生成汇编文件 (.s)
    g++ –S hello.i –o hello.s
    
  3. 汇编阶段(Assembly)

    • 将汇编语言转换成机器代码,生成二进制文件 (.o)
    g++ –c hello.s –o hello.o
    
  4. 链接阶段(Linking)

    • 将编译生成的目标文件与库文件链接在一起,生成可执行文件。
    g++ hello.o –o hello
    

上述四个步骤也可以直接一步完成

g++ hello.cpp -o hello
安装 GCC

在大多数 Linux 发行版中,GCC 已经预装。如果没有,可以通过包管理器安装:

sudo apt-get install build-essential  # Debian/Ubuntu
sudo yum install gcc-c++             # CentOS/Fedora

编译实战

  1. 编写源代码: 创建如下三个文件:

    #include "test.h"
    
    int main(){
        hellon(3);
        hello_n(1);
        return 0;
    }
    
    #include<stdio.h>
    
    void hellon(int);
    
    #include "test.h"
    
    static void inline hello();
    
    void hellon(int n){
        for(int i=0;i<n;i++){
            hello();
        }
    }
    
    static void inline hello(){
        printf("hello,world\n");
    }
    
  2. 编译源代码: 使用以下命令编译:

    gcc test.c main.c -o main
    
  3. 运行程序: 编译完成后,可以通过以下命令运行程序:

    ./main
    

分步编译

尝试使用 gcc 分步编译上述三个文件:

  • 先将两个 .c 文件编译为对应的 .o 文件
  • 再使用 gcc 将这两个文件链接得到可执行文件 main

思考题

上述步骤中printf函数的实现代码是否被编译了,如果没有,为什么最后可以成功调用printf函数