一.gcc/g++
二.gdb
三.make&makefile
四.git
一.gcc/g++
gcc/g++:编译器——将高级语言代码解释成为二进制机器指令
编译过程:预处理,编译,汇编,链接
gcc常见操作选项:gcc -E -S -c -o
例如main.c:gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o main
链接:就是将所有的源码指令以及库文件中的指令进行打包合并到一起
动态链接:链接动态库,将库中的函数符号信息记录到可执行程序中,生成的可执行程序较小,内存中冗余代码较少,但是会产生运行时依赖
静态链接:链接静态库,将库中使用到的函数的实现直接写入到可执行程序中,生成的可执行程序较大,内存中有可能会存在代码冗余,但是不会产生运行依赖
gcc编译器默认链接方式:动态链接
二.gdb
gdb:调试器-调试程序的运行过程,快速排查程序出问题的位置
调试前提:生成可以被调试的程序(debug程序),在编译代码时使用gcc -g选项(gcc默认生成release版本程序)
加载程序:gdb ./main
开始调试:start,run
逐步调试:next, step,until main.c:12, list main.c:12
断点调试:break main.c:12 break function_name; infor break(显示断点信息)
delete break_id(删除断点); continue
内存操作:print var=10(访问变量并可修改变量值) backtrace
三.make&makefile
make&makefile:项目的自动化构建工具
makefile:一个普通的文本文件,其中可以记录一个项目的构建规则
makefile编写规则:
目标对象:依赖对象
[tab]规则指令
make解释规则:
make在当前执行make指令的目录下找到makefile文件,然后在makefile中查找生成规则
1.make查找第一个目标对象,作为终极目标对象
2.检测依赖对象与目标对象的时间关系,判断目标对象是否需要重新生成
若目标对象不存在,则需要生成; 在目标对象生成依赖对象又有了修改,则需要生成
3.若目标对象需要生成,但是依赖对象不存在或者需要重新生成,则会查找依赖对象的生成规则先进行生成
4.如果需要生成则执行规则指令
make在完成了终极目标对象(makefile中的第一个目标对象)的指令执行之后就会退出,因此如果一个对象,不是第一个目标对象(终极目标)的依赖对象,则这个对象将默认不会被生成,需要通过make进行指定生成:make clean
main:main.o child.o child.h
gcc main.o child.o -o main
main.o:main.c child.h
gcc -c main.c -o main.o
child.o:child.c child.h
gcc -c child.c -o child.o
.PHONY:clean
clean:
rm -rf main.o child.o main
makefile中的其他编写规则:
1.伪对象:与外部的实际文件解除关联关系,表示这个对象无论如何都要进行规则指令的执行
声明:.PHONY:clean 将clean对象声明为伪对象
自动变量/预定义变量:在不同位置表示不同数据的内置变量
$< 所有依赖对象中的第一个
$^ 所有依赖对象
$@ 目标对象
这些自动变量都是出现在规则指令中的
函数:
$(wildcard ./*.c)获取指定规则的文件名
$(patsubst %c, %o, $(var)) 字符串替换 (将var变量中的内容.c替换成.o)
三.git
git:项目的版本管理工具,对代码进行托管,并进行版本管理
优点:1.托管备份,容灾性强
2.版本管理,随时可以进行版本回滚
git三板斧:git clone:从托管服务器克隆一个分支仓库到本地
git add --all ./:将当前目录下的所有修改进行登记
git commit -m "当前版本的备注--以便于以后回滚"
git push orign master 将本地仓库的版本同步到托管平台