gcc
编译四阶段:
预处理 (展开头文件)
编译(语法检查,将c编译成汇编语言)
汇编(将汇编语言变为二进制)
链接(将头文件与c库链接)
1.预处理
由于在test.c中使用了头文件 stdio.h ,所以 gcc 编译时首先要把头文件stdio.h中的内容加载到test.c中的首部
gcc -E test.c -o test.i
2.编译(三个功能)
词法分析,主要负责检查关键字、标识符等是否正确。
语法分析,主要负责检查程序中语句的语法是否正确。
语义分析,主要负责检查程序中语句的逻辑意义是否正确。
gcc -S test.i -o test.s
3.汇编
汇编阶段的任务是把汇编程序翻译成 CPU 可以识别的二进制文件,该文件又称为目标文件。
gcc -c test.s -o test.o
4.链接
目标文件虽然已经可以被 CPU 直接识别,但是单个目标文件一般是无法运行的。原因在于一个程序往往是由多个源文件组成的,每个源文件只对应一个目标文件。也许有人会问, test 程序不就只有一个源文件 test.c 吗,为什么也不能直接运行呢?原因是 test.c 使用了 stdio.h 对应的库函数,所以必须要把 test.o 文件和函数库文件链接在一起才能运行。
gcc test.o -o test
此外,也可以直接输入命令得到可执行文件
gcc test.c -o test
make
vim name.c
(编写简单程序)
vim Makefile
(写makefile 主要告诉make要做的事情)格式为:
target:object
(Tab) command
target为目标,通常是要产生的文件的名称
object:(dependency)依赖, 指用来输入从而产生目标的文件
command: 命令, 是make的执行动作,一个命令占一行, 命令前第一个字符为TAB键.
CC = gcc target = hello object = hello.o
$(target) : $(object)
(CC) $(object) -o $(target)
.PHONY:clean " clean:
rm -rf target*.o
注:target 为目标,通常是要产生的文件的名称
Object 为依赖(dependency)指用来输入从而产生目标的文件
Command 为命令 是make的执行动作,一个命令占一行,命令前第一个字符为TAB键。(上面$(CC)、rm 前均有Tab键)
gdb 调试工具
GNU 开发了 GDB 调试器(GNU Debugger)。GDB 的调试功能非常强大,甚至可以和 Visual C++、Visual Basic、Jbuilder 等开发工具的调试器相媲美。但 GDB 的缺点是没有图形调试界面。
vim add.c
#include<stdio.h>
Int add(int i,int j)
{
Return(i+j);
}
Int main()
{
Int i=1,j=4,sum =0;
Sum=add(i,j);
Printf(“sum i %d”,sum);
return 0;
}
gcc -g add.c -o add
./add
sum is 5
gdb add
(gdb) l "列出源文件
(gdb) r "run 运行
(gdb) b add "设置断点 程序继续往下运行
(gdb) c "continue
(gdb) info b "查看断点信息
(gdb) b 13 "在13行设置断点
(gdb) n "next 查看 不会进入函数内部运行
(gdb) s "step 可以在函数调用时进入函数内部运行