文章目录
- 1.什么是gcc
- 2.gcc特点
- 3.gcc编译过程
- 4.gcc常用选项
- 5.gcc编译多文件
1.什么是gcc
- gcc(GUN C Compile)编译器的作者是Richard Stallman,也是GNU项目的奠基者
- 什么是gcc?
gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compile),现在已经支持多种语言了,如C,C++,Java,Pascal,Ada,COBOL语言等 - gcc支持多种硬件平台,甚至对Don Knuth设计的MMIX这类不常见的计算机都提供了完善的支持
2.gcc特点
- gcc是一个可移植的编译器,支持多种硬件平台
- gcc不仅仅是个本地编译器,它还能跨平台交叉编译
- gcc有多种语言前端,用于解析不同的语言
- gcc是按模块话设计的,可以加入新语言和新CPU架构的支持
- gcc是自由软件
3.gcc编译过程
- 预处理(Pre-Processing),编译(Compiling),汇编(Assembing),链接(Linking)
(1)预处理:将头文件,宏进行展开
(2)gcc其实是一个工具链,在编译时,会调用其它的工具
(3)汇编:可重定位目标程序.o文件中程序的地址是从0开始的,正在要运行的程序其地址肯定不是从0开始的,要重新定位为可以在内存中可以加载运行的程序,通过链接器将可重定位目标程序的代码重新定位到内存中的某个地址
(4)链接器不仅有定位的功能,还会链接其它程序库,也会被链接到可执行文件中
(5)可执行文件加载或者拷贝到内存,即可运行
4.gcc常用选项
选项名 | 作用 |
-o | 产生目标(.i,.s,.o,可执行文件等) |
-E | 只运行C预编译器 |
-S | 告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s |
-c | 通知gcc取消链接步骤,即编译源码并在最后生成目标文件 |
-Wall | 使gcc对源文件的代码有问题的地方发出警告 |
-Idir | 将dir目录加入搜索头文件的目录路径 |
-Ldir | 将dir目录加入搜索库的目录路径 |
-llib | 链接lib库 |
-g | 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 |
- eg:01\hello.c
#include <stdio.h>
#define HELLOWORLD "hello world\n"
int main(void)
{
printf(HELLOWORLD);
return 0;
}
- 编译过程解释如下:
(1)预处理
预处理就是头文件展开,宏展开的步骤
gcc -E hello.c -o hello.i
vi hello.i
(2)编译
.s是一个汇编程序
gcc -S hello.i -o hello.s
vi hello.s
(3)汇编
hello.o文件是一个二进制文件
gcc -c hello.s -o hello.o
vi hello.o
gcc -c hello.c 可以显示生成同名的.o文件,等价于下面的
gcc -c hello.c -o hello.o 编译生成可重定位目标文件
(4)链接:不需要任何选项
gcc hello.s -o hello
./hello
- -Wall的使用
下面的eg如果不加-Wall选项,编译器是不报任何错误的,但是得到的结果却不是预期的
01\print.c
#include <stdio.h>
int main(void)
{
printf("Two plus two is %f", 4);
return 0;
}
下面的bad.c就是print.c
加上-Wall选项
5.gcc编译多文件
- eg代码如下:
===============01\hello_fn.h================
#ifndef _HELLO_FN_H
#define _HELLO_FN_H
void hello(const char* name);
#endif
===============01\hello_fn.c================
#include <stdio.h>
#include "hello_fn.h"
void hello(const char* name)
{
printf("hello %s!!!\n", name);
}
=====================01\main.c==================
#include "hello_fn.h"
int main(void)
{
hello("world");
return 0;
}
- 用法1:一次性编译
hello_fn.h
hello_fn.c
main.c
一次性编译
gcc hello_fn.c main.c -o newhello
- 用法2:独立编译
大型项目用的多,比如更新的main.c文件,则只需要编译main.c生成重定位目标文件,最后执行链接,生成可执行文件
gcc -Wall -c main.c -o main.o
gcc -Wall -c hello_fn.c -o hello_fn.o
gcc -Wall main.o hello_fn.o -o newhello 链接生成可执行文件