一、make / makefile
make是一条指令;makefile是当前路径下的一个文件;两者配合使用
例makefile文件内容:
mycode: mycode.c —— 依赖关系:名为mycode的可执行文件依赖mycode.c的源文件
(此处有个tab) gcc -o mycode mycode.c —— 依赖方法
clean:
(此处有个tab) rm -f mycode
有了这样的makefile文件以后,命令行只要敲“make”回车,那么mycode.c就会自动被编译;命令行只要敲“make clean”回车,那么mycode这个可执行文件就会被删除;
扩展:
- 如果被依赖的文件不存在在外面的目录中,make会扫描makefile文件里的其它依赖关系,找到生成被依赖文件的其它依赖关系,递归生成,直至完成;
- make扫描完外部文件和makefile内部依赖关系依旧找不到被依赖文件,则会中断并报错;
- “make”指令是执行“makefile”文件里的第一行,如果第一行变成“clean: tab 内容”那么“make”就会执行清除;而代码编译就需要“make mycode”回车;(建议把最常用的编译代码放在最前面)
- make编译代码的时候,如果代码没有更新(可执行程序的最新修改时间和源文件的最新修改时间比较,指令:stat 查看文件的时间数据),就不会重新编译了会显示无更新(提高编译效率);
- 如果想要不管修没修改都编译的话,可以在上方加上“.PHONY:mycode.exe”,这样生成"mycode.exe"这个可执行文件的编译就是每次都执行了;(但不建议,因为这种重编译会在可执行文件里面修改而不是重头编译,会导致一些问题,可执行文件最好还是删掉重新编译)(建议在clean前面加.PHONY:clean)
mycode: mycode.c —— 依赖关系
(此处有个tab) gcc -o $@ $^ —— $@表示依赖关系冒号左边的内容,$^表示依赖关系冒号右边的内容
- 正常指令“make”的时候不仅会编译文件,还会回显依赖方法,如果不需要回显,可以在依赖方法先前加上@;
- 注释用“#”
指令:stat [文件名]
功能:查看文件的时间数据
说明:Access 文件最近访问的时间(优化后访问好几次修改一次,避免过于频繁的修改;如果想修改Access用“touch [已存在文件名] —— 更新所有的时间”“touch -a —— 更新access”;"touch -m —— 修改modify时间";);modify 文件内容最近修改的时间;change 文件属性的最近修改时间;
二、应用(进度条)
前置:
- 换行(\n):单纯的换到下一行的同一处位置;回车(\r):移到当前行的最开始;
- 缓冲区:“printf("hellllllllo"); sleep(2);”会神奇的先休眠再打印,这是不合理的,因为打印出来的东西被存储到了标准输出流(flie* stdout)里面没有刷新;如果““printf("hellllllllo"); fflush(stdout); sleep(2);”像这样强制刷新就会先打印后休眠了;
- 倒计时:【printf("%-2d\r", innt); fflush(stdout); sleep(1); innt--;】其中"%-2d\r"里2d是一次显示两个字符,如果innt是一个字符那么就是"空+字符";负号是想让字符左对齐,\r是每次跳转到这一行的最开始,覆盖掉原来的内容
\\ "proccess.h"
#include<stdio.h>
typedef void (*callback_t) (int)
typedef void (*callback_b) ()
typedef "=" STPY_O
typedef ">" NARROW
typedef NUM 103
char process_o[NUM] ={0};
\\ 主函数,调用download函数,此函数通过函数指针调用了进度条;
\\ main.c
#include "proccess.h"
void download(callback_t cb, callback_b intiti)
{
total = 1000;
curr = 0;
intit();
while( curr <= total)
{
usleep(5000); //单位毫秒
int rate = curr * 100 / total;
(*cb)(rate);
curr++;
}
printf("\n");
}
int main()
{
download(proccessbar, initia_bar);
return 0;
}
\\ proccessbar.c
#include "proccess.h"
void proccessbar(int rate)
{
if (rate < 0 || rate > NUM - 3) return;
process_o[rate] = "STPY_O";
process_o[rate + 1] = "NARROW";
cycle_o = {"|", "/","-","\"};
printf("%-100s""%d%%""[%c]\r",process_o, rate, cycle_o[ rate % 4]);
fflush(stdout);
}
void initia_bar()
{
memset(process_o, '\0', sizeof(process_o));
return 0;
}
三、git 命令行
git是一个具有网络功能的版本控制器,它是开源的,特点是客户端和服务端是一体的(即,客户可以把自己磁盘内容开源让别人访问);github 和 gitee都是基于git这个工具建立的商业版的网页;
创建gitee仓库:gitignore这个选项是忽略临时文件(会生成一个配置文件【.gitignore】,凡是在这个配置文件里的后缀都不会被添加到仓库),只上传头文件、源文件;
3.1 安装 git
yum install -y git
安装完后:git --version 可以看到git的安装版本
3.2 将gitee与Linux同步
- 创建gitee仓库;
- 克隆/下载:HTTPS网址复制;
- git clone 网址 —— 会创建一个和仓库名同名的目录;
- 将要放到gitee仓库里的东西放到该目录下;
- git add 地址,添加到本地仓库里进行管理;
- git commit -m "提交日志,做了什么,认真写";
- git push —— 上传到云端;
扩展:
- git log :查看提交记录/日志;
- git status :查看仓库中文件的托管状态;
- 在首次使用git的时候需要配置git信息:[git config --global user.email "邮箱地址"] 、[git config --global user.name "名字"];注意:此处邮箱要和登录gitee的邮箱一致,才会结算工作量绿点点;
四、gdb调试工具
指令:gdb [可执行程序] —— 进入调试状态
内部指令:
- q/quit —— 退出;
- l/list —— 显示代码;
- l/list num —— 从第num行开始显示;
- list 1 回车 回车 回车 —— 会从第一行一直往后显示;
- list 函数名 —— 显示该函数对应代码;
- r —— 开始运行;
- b/breakpoint num —— 在第num行打断点;
- b 函数名 —— 在对应函数的起始行打断点;
- b 文件名: num —— 在该文件的对应行上打断点;
- info b —— 查看断点信息,即看自己在哪里打了断点;
- d num —— 删除第num个断点,注意这里的num不是行号;
- n/next —— 逐过程运行,即不进入函数运行;
- n 回车 回车 回车 —— 会一直向下运行;
- s —— 逐语句运行,即会进入到函数里运行;
- s 回车 回车 回车 —— 会一直向下运行;
- p 变量名 —— 查看变量当前的值;
- display 变量名 —— 常显示变量当前的值,每走一步显示在当前语句的下面;
- undisplay num —— 取消num编号对应的变量的常显示;
- until num —— 直接跳到某一行;
- finish —— 跑完所在的函数;
- c/continue —— 从一个断点处直接运行到另一个断点处停止;
- disable num —— 将第num个断点失效,但不删除(改变info b显示的Enb列信息);
- enable num —— 将第num个断点从失效变为激活;
- set var i=10 —— 在调试期间修改变量的值;
- breaktrace/bt —— 查看各级函数调用及参数;
- info locals / i locals —— 查看局部变量的值;