一:gdb
-g 向可执行程序中添加调试信息:
然后用gdp调试:gdb ./test -->run ->start
run:运行程序
start:开始逐步调试;
n 进行下一步调试(不进入函数);
s 进行下一步调试(进入函数);
b:添加断点(b filename:line 向指定文件指定行添加断点或者 b line 向指定行添加断点);
i :查看断点信息;
d num 删除断点序号为num的断点;
d 删除所有断点;
l :查看当前行附近的代码
l n 查看第n行附近的代码
c 继续运行(有多个断点,调试到一个断点,可以c后运行到下一个断点);
在14行添加断点,并且查看断点,删除断点,如果有多个文件需要添加断点,可以b filename:line
watch var 监控变量var的改变;
p var 打印var变量的值;
bt 打印函数调用栈;
ctrl+d 或者q退出gdb
注:如果run 后发现有错误,可以不用一步一步调试,可以借助bt(会打印出哪里有错误)
可以看出在main函数18行有错,那么就可以list 18,查看18行附近代码,并且b test.c:18在18行添加断点,然后再重新run,运行到18后,再查看变量的变化:
二:Makefile
makefile是一个文件,自动化编译,一旦写好,就需要一个make命令,整个工程就自动编译,极大的提高了软件开发的效率;
make是一个解释makefile中指令的命令工具。
原理:make会在当前目录下找名字为Makefile或makefile的文件,如果找到,它会找文件中第一个目标文件,并把这个文件作为最终的目标文件(test),如果这个目标文件依赖的文件(test.o mytmp.o)不存在,那么make 会在当前文件找test.o文件的依赖性,如果找到再根据规则生成test.o,依次类推,直至编译出第一个目标文件。
如果需要同时编辑两个文件可以在底行模式写入:vnew fileneme
用ctrl+w进行两个文件的切换。
test.c
这时我们需要gcc test.c tmp.c -o test来进行编译,但如果文件很多,就会很繁琐,那么我们就可以写一个makefile来对进行
然后用make
但是这样有一个问题,假如只修改了tmp.c,gcc test.c tmp.c -o test,就会把test.c再编译一遍,可是test.c就没有修改呀即没有编译的必要,那么这种操作就不合适;
将makefile 修改为:
make:
这样如果只修改了mytmp.c,就只会编译mytmp.c,然后再将mytmp.o和test.o链接一起。
但是这样还存在一个问题即存在若干文件,就要手动输入若干文件,如果不想手动输入每个文件,可以将makefile修改为:
1 SRC=$(wildcard ./*.c) #tets.c tmp.c
2 # 代表当前目录全部.c文件赋值给$(SRC) (./指当前目录,*.c指所有.c文件)
3
4 OBJ=$(patsubst %.c,%.o,$(SRC)) #test.o tmp.o
5 #代表将$(SRC)中全部.c文件替换为.o文件赋值给$(OBJ)
6
7 BIN=./tmp #BIN代表可执行程序
8
9 $(BIN):$(OBJ)
10 gcc $^ -o $@ # $^指所有冒号右边所有依赖文件 $@指冒号左边要生成的目标对象
11 %.o:%.c
12 gcc -c $< -o $@
13 # $< 指冒号右边所有依赖对象的第一个文件;
14 # 当用test.c生成test.o后,操作系统会自动将tmp.c变成第一个依赖文件生成tmp.o,依次循环直至所有.o文件全部生成
15
16 clean:
17 rm -f $(OBJ) $(BIN) #完成清理
如果目标文件是最新即没有重新生成的必要,make后会有文件是最新的警告,如果想要每次都生成目标文件,可以用.PHONY声明一个伪对象:
make:
三:进度条
1.fflush(stdout):刷新缓冲区,因为系统认为当缓冲区数据满后才会将缓冲区内容输出到显示器上,当刷新缓冲区后当有数据就会输出到显示器;
2.回车符\r与换行符\n
\r是回车符,即光标回到首字符
1 #include<stdio.h>
2 #include<unistd.h>
3 int main()
4 {
5 printf("hello,world!\r"); //光标回到字符h
6 fflush(stdout);
7 sleep(1);
8 printf("hello,sun!\n"); //会将hello,world!覆盖 有\n
9 fflush(stdout);
10 sleep(1);
11 return 0;
12 }
另一个\r实例:
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 int i=0;
7 char buff[10]={0};
8 for(i=0;i<10;i++)
9 {
10 buff[i]='#';
11 printf("[%-15s][%d%%]\r",buff,i);
12 fflush(stdout);
13 sleep(1);
14 }
15 printf("\n");
16 return 0;
17 }
回车后后面打印内容将前面内容覆盖。
四:yum
yum是linux软件包管理器。
列举安装包信息:
通过yum list 命令可以罗列出当前一共有那些安装包,但是由于包的数量多,可以用grep只筛选出需要了解的包。
|是管道符;
以上就是gcc安装包的具体信息。
但是如何安装软件?
然后输入用户密码;
yum会自动找到都有那些软件包需要下载,输入y确认安装即可。
当出现Complete!即安装完成。
注意:安装软件时由于需要向系统目录中写入内容,一般需要sudo(临时赋予管理员权限)或者切换root账号才可以完成;
yum安装软件只能将一个安装完成才能安装另一个,正在安装一个软件的过程中,如果再安装另一个软件,yum会报错。
卸载软件
同样需要sudo或者切换root账号用yum remove进行卸载。
总结:yum list 或者yum list | grep 软件名称:列举软件包名称;
sudo yum install 软件包:进行安装软件;
sudo yum remove 软件包:进行卸载软件;