Gcc是GNU推出的多平台编译器。
Gcc用法: gcc [options] filenames
options:编译器所需要的编译选项
filenames: 要编译的文件名
基本用法:
先编写一个简单hello.c文档如下
#include <stdio.h>
int main(void)
{
printf (Hello world!\n);
return 0;
}
在终端输入:gcc hello.c 则会在本文件夹输出一个a.out的执行文件,输入./a.out即可有结果
若输入:gcc hello.c -o [+新名字],则gcc就给出可执行新名称文件
Gcc编译流程
Hello.c → 预处理 → Hello.i → 编译 → Hello.s → 汇编 → Hello.o → 链接 → Hello.i
Hello.c → 预处理 → Hello.i 终端输入gcc -E hello.c -o hello.i
Hello.i → 编译 → Hello.s 终端输入gcc -S hello.c -o hello.s
Hello.s → 汇编 → Hello.o 终端输入gcc -c hello.c -o hello.o
Hello.o → 链接 → Hello.i 终端输入gcc -o hello.c -o hello
Gcc通过后缀来区别输入文件的类别,常见类型有:
.c 为后缀的文件: C语言源代码文件
.a 为后缀的文件: 是由目标文件构成的库文件
.C,.cc或.cxx 为后缀的文件: 是C++源代码文件
.h 为后缀的文件: 头文件
.o 为后缀的文件: 是编译后的目标文件
.s 为后缀的文件: 是汇编语言源代码文件
Gcc编译选项
-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地
要慢一些。
-O2,比-O更好的优化编译、连接,当然整
个编译、连接过程会更慢
例子:gcc -O hello.c -o hello 用time hello来检查时间
#include <stdio.h>
int main(void)
{
double counter;
double result;
double temp;
for (counter = 0; counter < 2000.0 * 2000.0 * 2000.0 / 20.0 + 2020;counter += (5 - 1) / 4)
{
temp = counter / 1979;
result = counter;
}
printf(Result is %lf\\n, result);
return 0;
}
gcc -c hello.c:只会产生hello.o中间文件
gcc -g hello.c -o hello:产生调试工具所需要的符号信息
I dirname:将dirname所指出的目录作为编译器寻找头文件的标准路径
C语言头文件:
①#include <A.h>
②#include “B.h”
对于<>,gcc在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;对于“”,gcc在当前目录中搜寻头文件。-I选项的作用是告诉gcc,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找
例:gcc foo.c -I/home/include -o foo
编译错误是代码中出现语法错误,程序无法执行。编译警告是编译器发现程序中不合理的地方,建议最好修改,但不修改也能执行。
-Wall:生成所有警告信息
-w:不生成任何警告信息
gcc -Wall hello.c -o hello
gcc -w hello.c -o hello
-DMACRO: 定义 MACRO 宏,等效于在程序中使用#define MACRO