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++编译器,在执行编译时分四步:

  1. 预处理:生成.i文件
  2. 编译:将预处理后的文件转换成汇编语言,生成.s文件
  3. 汇编:将源代码编译为机器语言的目标代码,生成.o文件
  4. 链接:连接目标代码,生成可执行程序二进制文件
# -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编译器为核心的一整套工具,主要包含以下三部分:

  1. gcc-core: 即GCC编译器,用于完成预处理和编译过程,把C/C++代码转换成汇编代码
  2. Binutils: 除GCC编译器外的一系列小工具,包括链接器(ld)、汇编器(as)、目标文件格式查看器(readelf)等
  3. 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基本使用

posted @ 2022-06-23 21:18  ylyzty  阅读(181)  评论(0编辑  收藏  举报