1、gcc概述
GNU计划提供的编译器。(在unix系统中,则是cc编译器)
2、由源文件到可执行文件需要经历的步骤
1.预处理:头文件展开(#include)、宏替换(#define)、条件编译(#ifdef)(.i)使用预处理器(预处理阶段处理的都是以#开头的代码)2.编译:检查语法、转成汇编、生成汇编文件(.s/.S)使用编译器3.汇编:由汇编变为目标代码(机器代码)生成目标文件(.o)使用汇编器as4.链接:链接所有目标文件,生成可执行程序,使用链接器ld
3、 交叉编译
在宿主机下编程出在目标机下运行的代码的过程,这就是交叉编译。(首先需下载交叉编译器),即在当前cpu平台编译出在其他cpu平台运行的代码的过程。
4、编译选项
(1)-E:只进行预处理(.i)
gcc -E demo.c > demo.i :将预处理信息放到.i文件中
(2)-S:只激活预处理和编译,就是指把文件编译成为汇编代码。(.s/.S)
(3)-c:只激活预处理,编译,和汇编,也就是他只把程序做成obj文件(.o)
(4)-o:制定目标名称
(5)-g 生成调试信息。GNU 调试器可利用该信息。
(6)-I+路径:指定头文件的第三方搜索路径
#include “stdio.h”和#include <stdio.h>的区别:搜索路径不同
<>:在系统头文件目录(/usr/include)中搜索,若没有,则报错
“”:先在当前目录中搜索,若没有,则去系统头文件目录中搜索,若还没有,在报错
规范:<> :包含系统头文件 “”:包含自定义文件
(””虽然方便,但是大体量代码,仍需注意规范,提高编译效率)
(7)-L:把所有目标文件链接成可执行文件
(8)-static:强制使用静态链接库
默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库
(9)-O1 -O2 -O3:编译优化
gcc -O1 demo.c -o demo :一级优化
gcc -O2 demo.c -o demo :二级优化
gcc -O3 demo.c -o demo :三级优化
(time ./demo:可以测算代码运行的时间)
(10)-w:关闭警告
gcc -w demo.c -o demo
(不推荐使用,警告可能不影响程序的执行,但忽视警告运行时可能会造成程序上的一些问题)
(11)-Wall:开启所有警告,使用它能够使GCC产生尽可能多的警告信息。
GCC给出的警告信息虽然从严格意义上说不能算作错误,但却很可能成为错误的栖身之所。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持标准、健壮的特性使用它能够使GCC产生尽可能多的警告信息。。所以将警告信息当成编码错误来对待,是一种值得赞扬的行为!
(12)-O1 -O2 -O3:编译优化
gcc -O1 demo.c -o demo :一级优化
gcc -O2 demo.c -o demo :二级优化
gcc -O3 demo.c -o demo :三级优化
(time ./demo:可以测算代码运行的时间)


Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
静态库链接时搜索路径顺序:
- ld会去找GCC命令中的参数-L
- 再找gcc的环境变量LIBRARY_PATH
- 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执行时搜索路径顺序:
- 编译目标代码时指定的动态库搜索路径
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径
- 默认的动态库搜索路径/lib
- 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径