介绍
gcc(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)。
gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将默认生成一个a.out文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。
编译过程
GCC 的编译过程可以划分为四个阶段:预处理、编译、汇编以及链接。如下图所示。
安装
更新软件包
sudo apt update
更新完成后使用以下命令安装gcc
sudo apt-get install gcc
查看版本号,若版本号正常显示则说明安装成功。
gcc --version
基本使用方法
后缀名文件说明
后缀名 | 文件说明 |
---|---|
.c | c源文件 |
.cpp | c++源文件 |
.h | c/c++头文件 |
.i | 预处理后的c/c++文件 |
.s | 汇编源文件 |
.o | 目标文件 |
.lib | 静态库 |
.dll | 动态库 |
gcc语法
gcc [options] file...
gcc常用选项
选项 | 描述 |
---|---|
-E | 仅预处理,不要编译、汇编或链接 |
-S | 仅编译,不要汇编和链接 |
-c | 编译和汇编,但不要链接 |
-o | 指定输出文件 |
-pie | 创建一个动态链接、位置无关的可执行文件 |
-I | 指定头文件的包含路径 |
-L | 指定链接库的包含路径 |
-shared | 创建共享库/动态库 |
-static | 使用静态链接 |
gcc编译简单示例
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ vim hello.c
#include"stdio.h"
void main()
{
printf("hello world!\n");
return;
}
####编译hello.c,默认生成a.out
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ gcc hello.c
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ls
a.out hello.c
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ./a.out
hello world!
####编译hello.c,使用-o选项指定输出hello
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ gcc -o hello hello.c
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ls
a.out hello hello.c
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ./hello
hello world!
gcc编译过程的理解
####预处理,输出hello.i源文件
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ gcc -E -o hello.i hello.c
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ls
hello.c hello.i
####编译,通过hello.i文件生成hello.s汇编文件
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ gcc -S -o hello.s hello.i
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ls
hello.c hello.i hello.s
####汇编,通过hello.s文件生成hello.o目标文件
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ gcc -c -o hello.o hello.s
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ls
hello.c hello.i hello.o hello.s
####链接,通过hello.o文件链接成hello可执行文件
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ls
hello hello.c hello.i hello.o hello.s
lgs@lgs-virtual-machine:~/Desktop/study/c_pro/hello$ ./hello
hello world!