1、淮海工学院计算机工程学院实 验 报 告 书课 程 名 : Linux 程序设计 题 目: 实验一 Linux C 编程工具:GCC 和 GDB 班 级: 软件 131 学 号: 2013122870 姓 名: 王裕 评语:成绩: 指导教师: 批阅时间: 年 月 日Linux 程序设计实验报告 - 0 -一、 实验目的与要求1. 掌握 Linux C 开发过程中的基本概念;2. 掌握如 GCC,GDB 等开发工具的使用。二、 实验内容1. 将参考代码录入到 test1.c 文件中,编译执行后发现结果与预期不一致,请使用GDB 调试,完成字符串反序输出功能。三、 参考源代码#include #in
2、clude #include int reverse_str(char *string);int main (void) char string = “Linux C Tools : GCC and GDB“; printf (“The original string is %s n“, string);reverse_str (string);int reverse_str (char *str) char *new_str;int i, size;size = strlen (str);if(new_str = (char *) malloc (size + 1) = NULL) retu
3、rn -1;for (i = 0; i b if condition_expression b (3) 查看中间输出结果: p set print element 0p 或说明:GDB 中查看字符串变量值可通过“set print element 0”命令,一次性显示字符串所有内容。(4) 分析中间结果,修改 28 行语句为 new_strsize - i-1 = stri;五、 实验结果与截图1. 编写 test1.c 文件并编译Linux 程序设计实验报告 - 2 -2.设置断点,进行 gdb 测试跟踪变量。执行到 i=27 时 size-i=0,str27已经超过 str 字符串限制,于
4、是 new_str0=0。输出 new_str 时,由于超过限制无法输出。所以修改程序第 28 行语句为 new_strsize - i-1 = stri;正确的程序运行结果如下图所示。Linux 程序设计实验报告 - 3 -六、 思考题1. 分析以下代码,完成指定范围内数值累加功能:#include /*函数功能:将 low 到 high 之间的数值累加求和*/int add_range(int low, int high) int i, sum;for (i = low; i void print1(int arg) printf(“%dn“, arg);/*print2.c */#inc
5、lude void print2(char* arg) printf(“%sn“, arg);Linux 程序设计实验报告 - 4 -调用库函数的源文件为 main.c 如下:/*main.c */void print1(int arg);void print2(char* arg);int main(int argc, char* argv) int i = 3; char* str = “test libary!n“;print1(i);print2(str);return 0 ;生成静态库(myprint.a)并使用的基本步骤步骤 1:编译 print1.c, print2.c 生成 p
6、rint1.o, print2.o 目标文件gcc -c print1.c print2.c步骤 2:生成 myprint 静态库文件 libmyprint.aar -r libmyprint.a print1.o print2.o步骤 3:拷贝库文件 libmyprint.a 到/usr/lib 目录下sudo cp libmyprint.a /usr/lib说明:若不将静态链接库拷贝到/usr/lib 目录下,在调用该库时需通过 GCC 选项-L 指定库文件所在路径步骤 4:调用静态库文件,编译生成可执行二进制文件gcc -o main main.c -lmyprint生成动态链接库(my
7、print.so)并使用的基本步骤步骤 1:编译 print1.c, print2.c 生成 print1.o, print2.o 目标文件gcc -c -fpic print1.c print2.c注意:GCC 选项“-fpic ”表示独立编址,运行时可计算出相应的内部地址。步骤 2:生成 myprint 动态链接库 libmyprint.sogcc shared print1.o print2.o -o libmyprint.so步骤 3:拷贝库文件 libmyprint.so 到/usr/lib 目录下sudo cp libmyprint.so /usr/lib步骤 4:调用动态库文件,
8、编译生成可执行二进制文件gcc -o main main.c libmyprint.so七、 实验体会本次实验是 Linux 的第一次实验,换了一个环境,很不适应,没有鼠标操作的情况下,可以通过上下键来选择 vim,gcc 等操作,也极为方便了我们的操作,再有就是gdb,语言代码除了符合最基本的语法规范之外还必须符合设计者的逻辑意图,如果发现生成的可执行文件运行结果不正确,则可以通过相应的调试环境来跟踪调试,因此需要用到 gdb。比如,用来查看文件,设置断点,运行程序,查看变量,表达式的值等等,其中的step,next 等很是重要:单步执行:step、next,step 命令步入函数,而 next 命令步过函数。step up 将一直执行,直至当前函数将控制返回调用它的函数为止。另外常Linux 程序设计实验报告 - 5 -见的 gdb 命令还有 file,kill,list,run,quit,make 等