文章目录
前言
这里介绍了一些编译,简单调试及make,makefile的过程,可以供大家参考和学习
一、gcc/g++编译器
在Linux中,gcc是对C语言进行编译的,g++是对C++进行编译的
编译程序需要经历四个过程:
1.预处理
预处理阶段编译器需要进行的过程:1.进行宏替换。2.将头文件展开。3.去注释。 4.条件编译。
在Linux中,需要我们输入:
gcc/g++ -E [file] -o [file].i
预处理后生成的文件以.i为后缀。
2.编译
编译阶段编译器需要进行的过程:语法语义的检测,并将源代码转换为汇编代码。
在Linux中,需要我们输入:
gcc/g++ -S [file] -o [file].s
编译后生成的文件以.s为后缀。
这里的file可以是还没有预处理过的.c文件,也可以是已经进行预处理过的.i文件,如果file是.i文件,则直接进行进行编译,如果是.c文件,则进行预处理和编译两个过程。
3.汇编
汇编阶段编译器需要进行的过程:将汇编代码转换为机器代码(二进制代码)。
在Linux中,需要我们输入:
gcc/g++ -c [file] -o [file].o
汇编后生成的文件称为目标文件,以.o为后缀,相当于windows下的xxx.obj文件格式。
4.链接
链接阶段编译器需要进行的过程:用目标文件+库文件生成可执行程序。
动态链接:gcc/g++ [file] -o [生成可执行程序的名称]
静态链接:gcc/g++ [file] -o [生成可执行程序的名称] -static
file [文件名]:可以查看当前文件的详细信息
ldd:可以查看可执行程序依赖的库文件
如果可执行程序是动态链接的,则会将代码当中依赖其他库函数的符号表在链接时编译到可执行程序中
二、gdb调试器
注:程序默认编译为release版本,如果想要编译成debug版本则需要加上命令行参数-g,只有在debug版本下才能够进行调试
gcc/g++ [file] -o [生成可执行程序的名称] -g
gdb下的操作:
①l(list):查看文件内容
②r(run):运行程序
③b [行号]:在某一行打断点
④i b (info breakpoint):查看所有断点信息
disable [断点序号]:使断点失效
enable [断点序号]:使断点生效
⑤n(next):逐过程执行,不进入函数,相当于F10
s(step):逐语句执行,进入函数,相当于F11
⑥p [变量名称]:打印变量的值
⑦bt/where:查看函数的调用堆栈(非常重要)
三、make及makefile
make是解释器,用来解释makefile文件。
makefile是书写编译规则的文件。
用make解释马makeile文件,可以自动生成可执行程序。
1.makefile文件书写规则
2.makefile文件书写规则make&makefile解释规则
①make会在当前目录下寻找名字叫Makefile或者makefile的文件
②永远只为生成第一个目标对象而服务
③若目标对象相对于依赖对象而言较新,则不生成
④make在生成第一个目标对象的时候,如果依赖对象也需要后续生成,则先生成依赖对象之后,使用依赖对象生成目标对象
3.内置变量和自定义变量
内置变量:
$^:代表所有的依赖对象
$@:代表所有目标对象
自定义变量:
增加这些内置变量和自定义变量后,可以使makefile文件的书写变得简洁
总结
gcc/g++,make及makefile对后期学习Linux十分重要,gdb也是后期调试代码中必不可少的一个过程。如果文章中有什么问题,还懂哥请指教!
未完待续!!!