本文参考 https://blog.csdn.net/qq_42475711/article/details/85224010
https://blog.csdn.net/hotfeeling_zy/article/details/1635609
https://blog.csdn.net/smallerxuan/article/details/81736693
1.GCC 简介
GCC(GNU Compiler Collection)即GNU编译器套件,属于一种编程语言编译器,其原名为GCC(GNU C Compiler)即GNU c语言编译器,虽然缩写一样但是功能上区别很大。GCC的初衷是为GNU操作系统专门编写的一款编译器,原本的GNU是专用于编译C代码,现如今已扩展为可以编译C、C++、Java、Objective-C等多种编程语言的编译器集合了。
2.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++。
gcc 和 g++ 都可以编译c, c++的程序,但是只有g++可以链接c++的库函数
3.安装GCC
在ubuntu16.04 下安装
sudo apt-get build-dep gcc
或者执行下面命令也可
sudo apt-get install build-essential
查看GCC版本
gcc --version
4.来一个简单的例子
4.1 C语言先出马
- 新建一个.c格式的文件,在目录下打开终端,输入
touch hello.c
然后在hello.c文件中写上
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
- 生成可执行文件
gcc hello.c -o hello
这时候生成了左边这个文件
- 启动可执行文件
./hello
效果如下:
4.2 C++来压轴
- 新建一个.cpp格式的文件,在目录下打开终端,输入
touch test.cpp
在文件中输入内容:
#include <iostream>
int main()
{
std::cout<<"hello world!\n";
return 0;
}
- 生成可执行文件
g++ test.cpp -o test
- 执行可执行文件
./test
效果如下:
gcc/g++ 编译的四个阶段
gcc/g++在执行编译和链接工作的时候,总共需要4步
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件转换成汇编代码,文件后缀为.s[编译器egcs]
3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]
1 预处理(Pre-Processing)
在该阶段,对头文件进行真正导入,对宏定义进行展开。可以使用 -E 参数让gcc 编译器在完成预处理阶段后停止下来。
gcc -E hello.c -o hello.i
2.编译(Compiling)
在编译阶段,gcc编译器会先进行语法检查,在通过检查后就会将源文件编译成汇编文件。用户可以使用 -S 参数让gcc编译器在完成这一过程后停止下来。
gcc -S hello.i -o hello.s
3.汇编(Assembling)
汇编阶段要进行的工作是将gcc前面过程中生成的汇编文件进行汇编得到二进制目标代码。用户可以使用 -c 参数让编译器在完成汇编后停止下来。
gcc -c test.s -o test.o
4.连接(Linking)
在者一阶段gcc编译器会将各个二进制模块和动态库、静态库进行链接操作,得到最终的可执行文件。
gcc test.o -o test