GCC简介程序员
GCC(GNU Compiler Collection)是一套功能强大、性能优越的编程语言编译器,它是GNU计划的表明做品之一。GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 Mac OS X操做系统的标准编译器编程
除了支持C,还支持C++、Java编程语言
GCC经常使用选项函数
1. 基本选项性能
类型 | 说明 |
-E | 预处理后即中止,不进行编译、汇编及链接 |
-S | 编译后即中止,不进行汇编及链接 |
-c | 编译或汇编源文件,可是不进行链接 |
-o file | 指定输出文件为 file |
例子:测试
gcc -E -o test.i test.c 将test.c 文件编辑(-E 说明预处理后即中止,不进行编译、汇编及链接),而后将预处理以后的输出输出到 test.i(经过 -o 说明)优化
gcc -S -o test.s test.i 将上一步的预处理获得的文件 test.i 进行编译成汇编语言的文件test.sspa
gcc -c test.s -o test.o 将上一步的汇编文件,编译成目标文件,可是不进行链接(因此是不能执行的)操作系统
gcc -o test test.o 将上一步编译的目标文件进行链接,生成可执行文件 test调试
上面的这种方式从预处理、汇编、链接一步一步走下来,可是在真实的开发环境中是一步从 .c源文件编译成可执行文件的:gcc -o test test.c
2.警告选型、
在编译程序的过程当中,编译器的报错和警告信息对于程序员来讲是很是重要的。GCC 包含了完整的出错检查和警告提示功能,它们能够帮助Linux 程序员尽快找出错误的或者潜在的错误代码,从而写出更加专业和优美的代码
类型 | 说明 |
-Wall | 启动全部警告信息 |
-Werror | 在发生警告时取消编译操做,即将警告看做是错误 |
-w | 禁用全部警告信息 |
例子: gcc -Wall -o test test.c 在编译test.c文件的时候显示全部的警告信息
3.优化选项
-O0:不进行优化处理
-O或者-O1:进行基本优化,这些优化在大多数状况下会使程序执行的更快
-O2:除了完成-O1级别的优化外,还要一些额外的调整工做,好比处理器指令调度等,这是GNU发布软件的默认优化级别
-O3:除了完成-O2级别的优化外,还进行循环的展开以及其余一些与处理器特性相关的优化工做
-Os:生成最小的可执行文件,主要用在嵌入式领域
通常来说,优化的级别越高,生成的可执行文件的运行速度越快,可是消耗在编译上的时间就越长,所以在开发的时候尽可能不要使用优化选项,在软件发行或者开发结束的时候才考虑对代码进行最终的优化。 建议使用-O2
这里介绍一个测试程序执行时间的命令:time 可执行文件(例如:time ./test),将会显示相似以下的信息
real 0m1.206s //总的执行时间(包括进程的调度和切换) user 0m1.172s //用户态执行的时间 sys 0m0.018s //内核态执行的时间
4.链接器选项
头文件:主要包含函数的声明部分,不包括函数的具体定义
库文件:函数的具体实现是在库文件中完成的
静态库文件:编译连接时,静态库文件的源码全都添加到可执行文件中,运行时就直接使用,可是生成的可执行文件通常比较大(静态库文件的后缀是 .a)
动态库文件:编译连接时,动态库文件的并不将源码添加到可执行文件中,而是在程序执行时由运行时的链接文件加载动态库文件,这样就更省系统开销。(动态库文件的后缀是 .so)
类型 | 说明 |
-Idirectory | 向GCC的头文件搜索路径中添加新的目录 |
-Ldirectory | 向GCC的库文件搜索路径中添加新的目录 |
-llibrary | 提示链接程序在建立可执行文件时包含指定的库文件,例如-lm表示链接到指定的math库 |
-static | 强制使用静态连接库,由于默认是使用动态连接库的 |
-shared | 生成动态库文件 |
例子:(文件名是 test.c)
#include<stdio.h> #include<math.h> int main() { int i=1; printf("%d\b", sin(i)); return 0; }
使用 gcc -o test test.c 编译源代码,可是在链接程序时出现错误,因此不能正确编译
主要是由于在C语言中,默认状况下只会链接C 语言的标准库(标准库的路径是 /usr/lib/libc.so),可是 头文件 math.h 所对应的库文件并不在标准库中,而是在 /usr/lib/libm.so,因此须要显式指定。
因此应该使用这个命令:gcc -o test test.c /usr/lib/libm.so 。这样就能够编译经过
或者使用 gcc -o test test.c -lm。 这里面-lm 选项就是表示指定 math库
5.其余选项
类型 | 说明 |
-x language | 指定输入文件的编程语言(默认gcc 是根据源文件的后缀识别源文件的,可是也能够经过 -x强制显式指定) |
-v | 显示编译器的版本号 |
-g | 得到有关调试程序的详细信息,须要结合gdb 一块儿使用,参见下一篇博客 |
-ansi | 支持符合ANSI标准的C程序 |