gcc/g++编译
1、GCC概述
GCC(GNU Compiler Collection,GNU编译器套件),是由GNU开发的编程语言编译器。GCC最初代表 GNU C Compiler
,当时只支持C语言。后来扩展为能够支持更多的编程语言,包括C++、Fortran和Java等。因此,GCC被重新定义为 GNU Complier Collection
,其执行效率与一般的编译器相比平均高20%~30%。
GCC下面有两个比较常用的工具分别是 gcc(GNU C Compiler)和g++(GNU C++ Compiler),即C语言编译器和C++编译器。通常用gcc编译纯C代码,g++编译包含C++的代码。
GCC的官网地址为:http://gcc.gnu.org/
gcc/g++的安装方式:
# Ubuntu 系统
sudo apt install gcc
sudo apt install g++
# Centos 系统
sudo yum install gcc
sudo yum install gcc-c++
# 默认安装 gcc/g++4.8.5, 安装高版本需要执行一些操作
2、编译
编译步骤
gcc/g++分别是GNU的c&c++编译器,在执行编译时分四步:
- 预处理:生成
.i文件
- 编译:将预处理后的文件转换成汇编语言,生成
.s文件
- 汇编:将源代码编译为机器语言的目标代码,生成
.o文件
- 链接:连接目标代码,生成可执行程序
二进制文件
# -E: 指示编译器只对输入文件进行预编译
g++ -E test.cpp -o test.i
# -S: 指示编译器在C++代码产生汇编语言文件后停止
g++ -S test.i -o test.s
# -c: 指示编译器仅把源代码编译为机器语言的目标代码
g++ -c test.s -o test.o
# -o: 指定可执行文件名,不使用-o参数时,Linux下默认为a.out
g++ test.o -o a.out
# 上面四步合在一起就是下面这个命令,在Linux下默认输出可执行文件a.out
g++ test.cpp
编译工具链
GCC编译工具链(toolchain),指以GCC编译器为核心的一整套工具,主要包含以下三部分:
- gcc-core: 即GCC编译器,用于完成预处理和编译过程,把C/C++代码转换成汇编代码
- Binutils: 除GCC编译器外的一系列小工具,包括链接器(ld)、汇编器(as)、目标文件格式查看器(readelf)等
- glibc: 包括了主要的C语言标准函数库,如打印函数printf,动态内存申请函数malloc等
3、g++重要编译参数
参数 | 解释 |
---|---|
-g | 编译产生带调试信息的可执行文件 |
-O(n) | 优化源代码,n通常为0~3 |
-I (大写) | 指定头文件搜索目录 |
-l (小写) | 指定程序要链接的库 |
-L | 指定库文件搜索目录 |
-std=c++11 | 设置编译标准 |
-o | 指定可执行文件名 |
-D | 在编译时定义宏 |
# 编译产生带调试信息的可执行文件
g++ -g test.cpp
# 优化:包括省略从未使用的变量、将常量表达式用结果值代替、循环展开等等,这些优化操作提高可执行文件的运行效率
# -O: 等价于-O1
# -O0: 不优化
# -O1: 默认优化
# -O2: 在-O1的基础上,再进行一些额外的调整,如指令调整等
# -O3: 在-O2的基础上,包括循环展开和一些与处理器特性相关的优化工作
g++ -O2 test.cpp
# /usr/include一般不需要指定,如果头文件不在/usr/include则需要-I参数指定
g++ -I ./HeadFile
# /lib,/uer/lib,/usr/local/lib中的库无需指定,直接使用-l参数就能链接
# 存放在其它目录的库则需要使用-L参数指定路径
# -l: 指定程序要链接的库, 后面紧接着库名(动态库:可以省略前缀lib,后缀.so;静态库:可以省略前缀lib,后缀.a)
# -L: 指定库文件所在目录
g++ -L ./LibFile -lreadline -ltinfo
# 指定使用c++11标准编译
g++ -std=c++11 test.cpp
# 编译时定义 TEST 宏
# 下面的C++代码,第7行的cout可以正常执行
g++ -DTEST test.cpp
#include <iostream>
using namespace std;
int main() {
#ifdef TEST
cout << "Defined the TEST macro." << endl;
#endif
}
完整的编译参数和解释可查看手册:man gcc/g++
参考文章:
[1] g++重要编译参数
[2] gcc/g++编译参数详解
[3] GCC基本使用