GCC编译器
原名GNU C语言编译器(GNU C Compiler)
介绍
GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC ,不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran、Ada、Pascal、Go 和 D 语言等等。
GCC、gcc、g++三者之间的关系:
gcc(GUN C Compiler)是GCC中的c编译器,而g++(GUN C++ Compiler)是GCC中的c++编译器。
gcc和g++两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。
安装命令
sudo apt install gcc g++
查看版本
gcc/g++ -v/--version
GCC工作流程
- 预处理——预处理器(cpp)
- 命令:
gcc -E
.cpp
文件生成.i
文件- 主要操作:
- 头文件展开:处理
#include
指令,将指定的头文件内容插入到源代码中。这可以是标准库头文件或用户自定义的头文件。 - 宏替换:处理
#define
指令,定义宏。预处理器会用宏的值替换代码中的宏名称。 - 删除注释:预处理器会删除源代码中的注释(
//
和/* ... */
),以便于后续的编译处理。 - 等
- 头文件展开:处理
- 示例:
gcc -E hello.c -o hello.i
- 命令:
- 编译——编译器(gcc)
- 命令
gcc -S
- 生成
.s
文件,汇编文件 - 主要操作:扫描(词法分析)、语法分析、语义分析、源代码优化(中间语言生成)、代码生成
- 示例:
gcc -S hello.c -o hello.s
- 命令
- 汇编——汇编器(as)
- 命令:
gcc -c
- 生成
.o
文件,二进制文件 - 主要作用:汇编器将汇编代码转变为可以执行的执行,生成目标文件
- 示例:
gcc -c hello.c -o hello.o
- 命令:
- 链接——链接器(ld)
- 命令:
gcc
- 生成课执行文件,默认的文件名是
a.out
- 主要作用:将函数库种相应的代码组合到目标文件中
- 示例:
gcc hello.o -o hello
- 命令:
- 一步生成最终可执行程序:
gcc hello.o -o hello
GCC常用参数选项
gcc编译选项 | 说明 |
---|---|
-v | 查看gcc版本号 |
-E | 生成预处理文件 |
-S | 生成汇编文件 |
-c | 只编译,生成.o文件,通常称为目标文件 |
-I | 指定头文件所在的路径 |
-L | 指定库文件所在的路径 |
-l | 指定库的名字 |
-o | 指定生成的目标文件的名字 |
-g | 包含调试信息,使用gdb调试需要添加该参数 |
-On | n=0~3,n越大编译器优化的越多 |
-D | 在程序编译的时候,指定一个宏 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
-fPIC/fpic | 生成与位置无关的代码 |
-shared | 生成共享目标文件,通常用在建立共享库时 |
-std | 指定C语言标准,如-std=c99 ,按照C99标准来编译C代码 |