程序的流程:
源代码(.c) 预处理 编译 汇编 链接 可执行文件
文件后缀介绍:
.c C原始程序
.C /.cc/.cxx C++原始程序
.m Objective-C原始程序
.i 已经预处理的C原始程序
.ii 已经预处理的C++原始程序
.s/.S 汇编语言原始程序
.h 预处理文件(头文件)
.o 目标文件(可执行文件)
.a/.so (库文件)
程序预处理:
gcc -o t.i t.c -E
程序编译,生成汇编代码
gcc -o t.s t.i -S
将汇编代码生成可执行文件
gcc -o t.o t.s
链接:
gcc在编译的时候默认使用动态链接库,编译链接时并不把库文件的代码加入到可执行文件中,而是在程序执行的时候动态加载链接库,这样可以节省系统开销。
当头文件与gcc不在同一目录下要用-Idir编译,它是指头文件,而添加库文件时需用-Ldir参数
在include语句中,“<>”表示在默认路径“/usr/include”中搜索头文件,引号""表示在本目录中搜索。
Linux下的库文件命名时有一个规定:必须以l、i、b三个字母开头,因此,在用“-l”指定链接库文件时可以省去l、i、b三个字母。也就是说“-llibsunq”有时候写成“-lsunq”。
如果要引用的动态库在/lib/libm-2.3.2.so:00008610 W 中
去掉 lib,去掉后面的版本号,就是m
所以可以gcc -o main.o main.c -lm
参数:
-c 只编译不链接
-S只编译不汇编
-E只进行预编译
-g 在可执行程序中包含调试信息
-o file 将文件输出到file当中
-v显示GCC版本信息
-I dir 在头文件的搜索路径中添加dir目录
-L dir 在库文件的搜索路径中添加dir目录
-static 链接静态库
-llibary 链接库名字为libary的库文件
GCC 编译器的主要参数
-ansi支持符合ANSI的C程序
-pedantic 允许发出ANSI标准所列的全部警告信息
-pedantic-error 允许发出ANSI标准所列的全部错误信息
-w 关闭所有告警
-Wall 允许发出gcc 提供的所有有用的警告信息
-werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译
GCC还可以优化代码
gcc -o main.o main.c -O2
-On n代表优化的级别,n越大,优化的级别越大,速度也就越快