1.C++语言的编译器及编译流程

1.C++编译器

编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。以下是一些主流的C++编译器及其简要用法:

  1. GNU Compiler Collection (GCC):’

    • GCC原名GNU C Compiler,后来逐渐支持更多的语言编译(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),所以变成了GNU Compiler Collection(GNU编译器套装),是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布,是大多数类Unix(如Linux、BSD、Mac OS X等)的标准编译器,而且适用于Windows(借助其他移植项目实现的,比如MingW、Cygwin等)。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。

    • 安装:在大多数Linux发行版上,你可以使用包管理器安装GCC。例如,在Ubuntu上,可以运行 sudo apt-get install g++

    • 编译:使用命令 g++ 后接源文件名,例如 g++ myfile.cpp

    • 生成可执行文件:./a.out(默认输出文件名)。

  2. Clang:

    • Clang 是一个基于LLVM的编译器前端,支持C、C++和Objective-C
    • 安装:在大多数Linux发行版上,你可以使用包管理器安装Clang。例如,在Ubuntu上,可以运行 sudo apt-get install clang
    • 编译:使用命令 clang++ 后接源文件名,例如 clang++ myfile.cpp
    • 生成可执行文件:./a.out(默认输出文件名)。
  3. Microsoft Visual C++ Compiler:

    • 通常与Visual Studio集成使用,使用Visual Studio创建项目,然后通过IDE进行编译和调试。
    • 也可以通过命令行使用,使用 cl 命令。例如,cl myfile.cpp 编译源文件。
  4. Intel C++ Compiler:

    • Intel C++ Compiler 是英特尔公司提供的优化C++编译器。它针对英特尔处理器进行了优化,可以生成高度优化的代码,并提供了一些高级优化技术,如向量化和多线程支持。
    • 安装:需要单独安装Intel Parallel Studio。
    • 使用:在命令行中,使用 icpc 后接源文件名,例如 icpc myfile.cpp
    • 生成可执行文件:./a.out(默认输出文件名)。
  5. MinGW-w64:

    • MinGW 是一个在 Windows 平台上使用 GCC 工具链的开发工具集合。它提供了 GCC 编译器套件的 Windows 版本,并通过命令行界面(CLI)提供与 GCC 类似的命令和选项。
    • 安装:可以使用MinGW-w64的安装程序或使用包管理器(例如MSYS2)安装。
    • 编译:使用命令 g++ 后接源文件名,例如 g++ myfile.cpp
    • 生成可执行文件:./a.exe(默认输出文件名)。

2.编译器工作流程

一个现代编译器的主要工作流程:

源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)。

在这里插入图片描述

  1. 预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释这些没用的东西都给扬了。
  2. 编译(Compiling):处理好之后,就可以正式开始编译,首先会编译为汇编代码。
  3. 汇编(Assembling):接着就该将汇编代码编译为机器可以执行的二进制机器指令了,会得到一个二进制目标文件。
  4. 链接(Linking):最后需要将这个二进制目标文件与系统库和其他库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。

以G++为例,编译一个cpp程序的代码为:

预处理:g++ -E main.cpp -o main.i
编译:g++ -S main.i -o main.s
汇编:g++ -c main.s -o main.o
链接:g++ main.o -o main
命令汇总:g++ main.cpp -o main
多文件一起编译:g++ main.cpp test.cpp -o main

3. 编译选项

C++编译器通常提供许多编译选项,这些选项允许你指定如何进行代码生成、优化、调试信息等方面的设置。以下是一些常见的C++编译选项:

  1. -c 生成目标文件而不进行链接,产生.o.obj文件,用于后续的链接阶段。

    g++ -c myfile.cpp
    
  2. -o 指定输出文件的名称。

    g++ myfile.cpp -o myexecutable
    
  3. -g 包含调试信息,方便在调试器中进行源代码级别的调试。

    g++ -g myfile.cpp
    
  4. -Wall 开启常见的警告信息,有助于发现潜在的问题。

    g++ -Wall myfile.cpp
    
  5. -O 启用各种优化级别,可以是 -O1, -O2, -O3 等。

    g++ -O2 myfile.cpp
    
  6. -std 指定所使用的C++标准版本。

    g++ -std=c++11 myfile.cpp
    
  7. -I 指定包含文件的搜索路径。

    g++ -I/path/to/include myfile.cpp
    
  8. -L 指定库文件的搜索路径。

    g++ -L/path/to/lib myfile.cpp
    
  9. -l 指定要链接的库。

    g++ myfile.cpp -lmylibrary
    
  10. -D 定义预处理宏。

    g++ -DDEBUG myfile.cpp
    
  11. -E:预处理(Preprocess)

    • 这个选项告诉编译器只执行预处理阶段,将源代码转换为经过宏展开、条件编译等处理的纯文本文件。
    • 不进行编译、汇编或链接,只生成预处理后的代码,通常使用.i扩展名。
    • 这对于查看宏展开后的代码或检查预处理阶段的问题很有用。
    g++ -E main.cpp -o main.i
    
  12. -S:生成汇编代码(Generate Assembly)

    • 这个选项告诉编译器执行预处理和编译阶段,但不进行汇编或链接。它生成的输出是汇编代码文件,通常使用.s扩展名。
    • 汇编代码是由机器指令和汇编语言构成的中间表示,可用于后续的汇编和链接。
    g++ -S main.i -o main.s
    

    在这里插入图片描述

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月落霜满天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值