【注】以下步骤仅列出了linux环境下开发和调试c语言的简要步骤,主要反映工具链间是如何配合的,
关于gcc和gdb以及makefile的更详细的用法拟在后续的学习总结中不断进行深化。
step1:在cygwin下,输入gcc -v和gdb -v查看是否安装了gcc和gdb,以及安装的版本情况。
step2:以《算法:c语言实现》中的union-find算法为实验例程,输入采用从文件中读取。
<1>用mkdir src建立src文件夹,然后vim union_find.c,输入如下代码:
1 #include <stdio.h> 2 3 #define N 10 4 5 void main() 6 { 7 int i; 8 int j; 9 int k; 10 int id[N]; 11 int size[N]; 12 int p; 13 int q; 14 15 FILE *fp = fopen("data.txt","rt"); 16 if(fp == NULL) 17 { 18 printf("cannot open file!\n"); 19 return; 20 } 21 22 lseek(fp,0,SEEK_SET); 23 24 for(i = 0; i < N; i++) 25 { 26 id[i] = i; 27 size[i] = 1; 28 } 29 30 31 while(fscanf(fp,"%d-%d",&p,&q)== 2) 32 { 33 for(i = p; i != id[i]; i = id[i]) 34 { 35 id[i] = id[id[i]]; 36 } 37 for(j = q; j != id[j]; j = id[j]) 38 { 39 id[j] = id[id[j]]; 40 } 41 if(i == j) 42 { 43 printf("null\n"); 44 continue; 45 } 46 47 if(size[i] > size[j]) 48 { 49 id[j] = i; 50 size[i] += size[j]; 51 } 52 else 53 { 54 id[i] = j; 55 size[j] += size[i]; 56 } 57 printf("%d-%d\n",p,q); 58 59 } 60 61 for(k = 0; k < N; k++) 62 { 63 printf("size[%d] = %d\n",k,size[k]); 64 } 65 fclose(fp); 66 67 }
<2>vim makefile,输入如下最原始的makefile语句,gcc命令中加入-g用来添加gdb所需信息。
union_find:union_find.o gcc -g -o union_find union_find.c ./union_find .PHONY:clean clean: rm -rf union_find.exe union_find.o
<3> 在cygwin中,进入src目录,输入make命令,即可编译执行。
<4>在cygwin中输入gdb,运行gdb。
gdb常见命令可以参考http://www.cnblogs.com/hibernate6/archive/2012/03/17/2521916.html
(gdb)file [filename] 加载要调试的文件
(gdb)l list,列出源程序
(gdb)r run,运行
(gdb)b [function/行号] break, 设置断点
(gdb)p [变量名] print,打印变量值
(gdb)s step,单步执行
(gdb)q 退出gdb
(gdb)info break 显示当前断点信息