您的当前位置:首页正文

实验4 编译和调试工具的使用-2014

2024-01-08 来源:好走旅游网
实验四 编译和调试工具的使用

班级:计本112 姓名:邵绪宝 学号:201106080226

三、操作 1、GNU C编译器 1) 使用gcc

通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下: gcc [options] [filenames]

命令行选项指定的编译过程中的具体操作 1:预处理:命令:gcc -E hello.c -o hello.i 2:编译:命令:gcc -S hello.i -o hello.s 3:汇编:命令:gcc -c hello.s -o hello.o 4:链接:命令:gcc hello.o -o hello 2) gcc常用选项

当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。

选项含义:

-o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没 有指定,默认文件名是a.out. 例如, # gcc test.c

编译成功后,当前目录下就产生了一个a.out文件。

也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。 例如:

#gcc –o count count.c

此时得到的可执行文件就不再是a.out,而是count。

-c GCC 仅把源代码编译为目标代码。默认时GCC 建立的目标代码文件有一个.o 的 扩展名。

-E 对文件进行预处理

-S 对文件进行编译,生成汇编代码。

-O 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。 -g 在可执行程序中包含标准调试信息。

-Wall 允许发出GCC 能提供的所有有用的警告,也可以用-W(warning)来标识指定的 警告。 -l name

链接静态库

-L dir 库文件的搜索路径 3) 执行文件

格式: ./可执行文件名 例: # ./a.out # ./count 4) 例子

mypow.c:定义mypow()函数

unsigned long long mypow(unsigned int x, unsigned int y) { unsigned long long res=1; if (y==0) res = 1; else if (y==1) res = x; else res = x * mypow(x, y-1); return res; }

powtest.c:调用mypow()函数 #include #include int main(int argc, char *argv[]) { unsigned int x, y; unsigned long long res; if ((argc<3) || (sscanf(argv[1], \"%u\ { printf(\"Usage:pow base exponent\\n\"); exit(1); } res = mypow(x, y); printf(\"%u ^ %u = %u\\n\ return 0; } 编译过程:

# gcc -c mypow.c # ar rcsv libpow.a mypow.o a - mypow.o

# gcc -o powtest powtest.c -L. -lpow # ./powtest

Usage:pow base exponent # ./powtest 2 10 2 ^ 10 = 1024

2、gdb调试工具 1) 调试编译代码

为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。

在编译时用 –g 选项打开调试选项。 2) gdb基本命令 命 令 file kill list next step run quit watch break make shell

描 述 装入欲调试的可执行文件 终止正在调试的程序 列出产生执行文件的源代码部分 执行一行源代码但不进入函数内部 执行一行源代码并进入函数内部 执行当前被调试的程序 终止gdb 监视一个变量的值而不管它何时被改变 在代码里设置断点,使程序执行到这里时被挂起 不退出gdb就可以重新产生可执行文件 不离开gdb就执行UNIX shell 命令 3、make的使用

(1)用vi编辑以下程序,程序清单:

main.c function1.h function1.c

function2.hfunction1.h function2.c //main.c #include \"function1.h\" #include \"function2.h\" int main(int argc, char **argv) { function1_print(\"hello\"); function2_print(\"world\"); }

//function1.h void function1_print(char *str);

//function1.c #include \"function1.h\" void function1_print(char *str) { printf(\"This is function1 print %s\\n\}

//function2.h void function2_print(char *str);

//function2.c #include \"function2.h\" void function2_print(char *str) return 0; { printf(\"This is function2 print %s\\n\} 实验要求:

(1)画出各个源程序、目标文件以及最终的目标文件之间的依赖关系图。

mian依赖于main.c function1.h function2.h function1.o依赖于function1.c function1.h function2.o依赖于function2.c function2.h

(2)编辑makefile文件 all:main

main.o:main.c function2.h function1.h

gcc -o main mian.c

function.1o:function1.c function1.h

gcc -o function1 function1.c

function2.o: function2.c function2.h

gcc -o function2 function2.c

clean:

rm .o* main

(3)利用make命令进行上述程序的编译,生成可执行代码并运行。

make编译

(4)修改其中一个源文件,重新make,察看编译过程。

(5)通过使用makefile变量和隐含规则,对makefile文件进行简化

$SRC:main.o function1.o function2.o main:

gcc -o main &SRC clean:

rm main $SRC

四.试验总结

写出详细的试验过程及其试验结果。

掌握Linux提供的vi编辑器来编译C程序,用gcc、gdb编译、调试C程序,使用

make工具进行编译。

因篇幅问题不能全部显示,请点此查看更多更全内容