GCC
-
gcc(GNU Compiler Collection),是GNU组织为了编译Linux内核代码而开发一款C语言编译器,现在还支持c++、java等语言。
-
gcc编译程序的主要过程
-
预处理(Pre-Processing)
将.c代码进行预处理,主要处理源文件的预处理指令
# 生成以.i结尾的预处理文件 可指定生成文件名 gcc -E hello.c <-o hello.i>
-
编译 (Compiling)
将上一步的.i文件转换成.s汇编代码
# 生成以.s结尾的汇编文件 gcc -S hello.i<-o hello.s>
-
汇编 (Assembling)
将上一步的.s文件翻译成二进制指令
# 会生成以.o结尾的目标文件 gcc -c hello.s <-o hello.o> # 也可直接省略上两步,直接-c生成目标文件
-
链接 (Linking)
将若干目标文件、库文件等链接起来生成可执行文件
# 默认会生成a.out可执行文件 gcc a.o b.o c.o ... # 也可以使用-o指定可执行文件的名字。 gcc hello.o -o hello # 执行程序 ./hello # 编译执行: gcc a.o b.o c.o && ./a.out
粗略演示。。。
生成的hello.i文件(可以看到添加了很多命令)
-
生成的hello.s汇编文件
生成的目标文件打开是乱码(不过我们不是机器,估计也看不懂吧哈哈,这里就不作演示)
-
gcc常用参数
选项 说明 -E 预处理 -S 生成汇编文件 -c 生成目标文件 -o 设置编译结果的名字(.i/.s/.o) -I(大写i) 设置要导入的头文件的路径 -l(小写L) 设置要链接的库名,例如:使用sqrt、pow等数学函数时就需要链接数学库 -lm -L 设置要链接的库的路径 -D 在编译时定义宏 -g 编译时添加调试信息,这样编译出的程序可以用gdb调试。 -Wall 显示所有警告,编译器会以更严格的标准检查代码 -Werror 把警告当错误处理 -std 指定编译器要遵循的语法标准,c89,c99,c11,当前使用系统默认的是c99标准。 -
文件类型
.h 头文件,里面是一些对.c文件的说明 .c 源文件,里面是一些功能型代码 .i 预处理文件 .s 汇编文件 .o 目标文件 .gch 头文件的编译结果,用于检查自定义的头文件是否有语法错误,建议立即删除 .a 静态库文件,相当Windows系统下的.lib文件 .so 动态库文件,相当Windows系统下的.dll文件