1.C++编译器
编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。以下是一些主流的C++编译器及其简要用法:
-
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
(默认输出文件名)。
-
-
Clang:
- Clang 是一个基于LLVM的编译器前端,支持C、C++和Objective-C
- 安装:在大多数Linux发行版上,你可以使用包管理器安装Clang。例如,在Ubuntu上,可以运行
sudo apt-get install clang
。 - 编译:使用命令
clang++
后接源文件名,例如clang++ myfile.cpp
。 - 生成可执行文件:
./a.out
(默认输出文件名)。
-
Microsoft Visual C++ Compiler:
- 通常与Visual Studio集成使用,使用Visual Studio创建项目,然后通过IDE进行编译和调试。
- 也可以通过命令行使用,使用
cl
命令。例如,cl myfile.cpp
编译源文件。
-
Intel C++ Compiler:
- Intel C++ Compiler 是英特尔公司提供的优化C++编译器。它针对英特尔处理器进行了优化,可以生成高度优化的代码,并提供了一些高级优化技术,如向量化和多线程支持。
- 安装:需要单独安装Intel Parallel Studio。
- 使用:在命令行中,使用
icpc
后接源文件名,例如icpc myfile.cpp
。 - 生成可执行文件:
./a.out
(默认输出文件名)。
-
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)。
- 预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释这些没用的东西都给扬了。
- 编译(Compiling):处理好之后,就可以正式开始编译,首先会编译为汇编代码。
- 汇编(Assembling):接着就该将汇编代码编译为机器可以执行的二进制机器指令了,会得到一个二进制目标文件。
- 链接(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++编译选项:
-
-c
: 生成目标文件而不进行链接,产生.o
或.obj
文件,用于后续的链接阶段。g++ -c myfile.cpp
-
-o
: 指定输出文件的名称。g++ myfile.cpp -o myexecutable
-
-g
: 包含调试信息,方便在调试器中进行源代码级别的调试。g++ -g myfile.cpp
-
-Wall
: 开启常见的警告信息,有助于发现潜在的问题。g++ -Wall myfile.cpp
-
-O
: 启用各种优化级别,可以是-O1
,-O2
,-O3
等。g++ -O2 myfile.cpp
-
-std
: 指定所使用的C++标准版本。g++ -std=c++11 myfile.cpp
-
-I
: 指定包含文件的搜索路径。g++ -I/path/to/include myfile.cpp
-
-L
: 指定库文件的搜索路径。g++ -L/path/to/lib myfile.cpp
-
-l
: 指定要链接的库。g++ myfile.cpp -lmylibrary
-
-D
: 定义预处理宏。g++ -DDEBUG myfile.cpp
-
-E
:预处理(Preprocess)- 这个选项告诉编译器只执行预处理阶段,将源代码转换为经过宏展开、条件编译等处理的纯文本文件。
- 不进行编译、汇编或链接,只生成预处理后的代码,通常使用
.i
扩展名。 - 这对于查看宏展开后的代码或检查预处理阶段的问题很有用。
g++ -E main.cpp -o main.i
-
-S
:生成汇编代码(Generate Assembly)- 这个选项告诉编译器执行预处理和编译阶段,但不进行汇编或链接。它生成的输出是汇编代码文件,通常使用
.s
扩展名。 - 汇编代码是由机器指令和汇编语言构成的中间表示,可用于后续的汇编和链接。
g++ -S main.i -o main.s
- 这个选项告诉编译器执行预处理和编译阶段,但不进行汇编或链接。它生成的输出是汇编代码文件,通常使用