标签:
一、学习目标
1.熟悉Linux系统下的开发环境
2.熟悉vi的基本操作
3.熟悉gcc编译器的基本原理
4.熟练使用gcc编译器的常用选项
5.熟练使用gdb调试技术
6.熟悉makefile基本原理及语法规范
7.掌握静态库和动态库的生成
二、学习任务
1.教材第一章,第七章学习:阅读并消化教材内容
2.《嵌入式Linux应用程序开发标准教程》第三章3.1-3.5的学习
3.完成实验:
练习vimtutuor
练习gcc编译运行代码
练习gdb调试代码
把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so
编写makefile,让代码编译,上述静态库和共享库的使用自动化。
三、学习过程
1.linux下的C语言编程环境
(1)编辑器
完成对所录入文字的编辑功能,最常用的是vi(vim)和emacs
vi的三种模式及用法
·命令行模式:最初进入的默认模式,可上下移动光标进行删除字符或整行删除,也可进行复制粘贴,但无法编辑
·插入模式:可以编辑,按[Esc]键回到命令行模式
·底行模式:可以进行保存或退出,或设置编辑环境。
(2)编译链接器
指源代码转化成生成可执行代码的过程,最常用的编译器是gcc。
gcc的编译流程
·预处理阶段:头文件和宏定义,—E可以让gcc在预处理结束之后停止编译过程,因此可以看到预处理的过程
一般格式为:gcc [选项] 要编译的文件 [选项] 目标文件
gcc -E hello.c -o hello.i
·编译阶段:gcc将代码翻译成汇编语言,使用选项-S只进行编译而不进行汇编,结果生成汇编代码。
gcc -S hello.i -o hello.s
汇编阶段:将.s文件转成目标文件,使用选项-c可以看到汇编代码转换为二进制目标代码。
gcc -c hello.s -o hello.o
链接阶段:默认搜索链接到libc.so.6函数库当中,调用库文件中已经实现的函数。
gcc编译选项分析
常用选项
-I dir :在头文件的搜索路径列表中添加dir目录,当用户希望添加放置在非默认位置的头文件时可以通过该选项来指定。
库选项
静态库:一系列的目标文件的归档文件,在编译时会搜索静态库提取出其所需要的目标文件并将其复制到该程序可执行的二进制文件中。
动态库:在程序编译时并不会被链接到目标代码中,而是在程序运行时才会被载入。
警告和出错选项
优化选项
"-On":n是一个代表优化级别的整数,n的取值范围对应的优化效果并不完全相同,比较典型的范围是从0变化到2或者3。
“-O”主要进行线程跳转和延迟退栈。 一般在程序即将发行的时候才考虑对其优化。
体系结构相关选项
(3)调试器
gdb调试器,可方便的设置断点、单步跟踪。
gdb的使用流程
·查看文件:键入l(list)查看所载入的文件
·设置断点
i)按行设置断点:b+对应行号即可,可设置多个断点,运行到设置断点的一行程序会自动停止
ii)函数断点:按函数设置断点只需把函数名列在命令“b”之后
iii)条件断点:b 行数或函数名 if 表达式
·查看断点情况:info b,在断点键入bt可查到调用函数(堆栈)的情况。
·运行代码:r+行号可从指定行开始运行代码,默认从头执行
·查看变量值:p+变量值即可
·单步运行
·恢复程序运行
gdb基本命令:
可通过help选项查看
help all:
四、makefile使用
Makefile带来的好处就是——“自动化编译”,一但写好,只需要一个 make 命令,整个工程便可以完全编译,极大的提高了软件的开发效率
一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作
make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
下面是一个简单的makefile的例子。
使用下面的命令进行编译:
$ gcc -c code.c -o code.o
$ gcc -c prog.c -o prog.o
$ gcc prog.o code.o -o test
首先$ vim Makefile
test: prog.o code.o
gcc prog.o code.o -o test
prog.o: prog.c code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o test
编译命令反向写makefile
有了这个Makefile,不论什么时候修改源文件,只要执行一下make命令,所有必要的重新编译将自动执行。make程序利用Makefile中的数据,生成并遍历以test为根节点的树;现在以上面的实例,来学习一下Makefile的一般写法:
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
.......
一个Makefile文件主要含有一系列的规则,每条规则包含一下内容:一个目标,即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如‘clean’;一个或多个依赖文件的列表,通常是编译目标文件所需要的其他文件。之后的一系列命令,是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,并以tab开头(初学者务必注意:是tab,而不是空格) 执行以上Makefile后就会自动化编译
Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:
macroname = macrotext
使用宏的格式为:
$(macroname)
也可以理解为变量
VIM中:
:set nu 显示行号
:set ai 自动缩行
:set ts=4 设置一个 TAB 键等于几个空格
[[ 转到上一个位于第一列的"{"
]] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行
gd 转到当前光标所指的局部变量的定义
GCC编译代码的过程如下:
编译过程比较难记,我们简化一下,前三步,GCC的参数连起来是“ESc”,相应输入的文件的后缀是“iso”,这样记忆起来就容易多了。
GDB:
注意使用GCC编译时要加“-g”参数。
问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?
我认为应该先用n命令,直接是函数的结果,如果正确就向下运行,如果不正确就说明函数内部有问题,再用s命令。
使用vim 输入以下代码,联系使用“K”查找帮助文档:
先在vim中写好这六个代码。
3.练习gcc编译运行代码;
4.练习gdb调试代码;
5.把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so;
6.编写makefile,让代码编译,上述静态库和共享库的使用自动化。
标签:
原文地址:http://www.cnblogs.com/20135335hs/p/4842474.html