2014025692 《嵌入式系统程序设计》第二周学习总结

2014025692 《嵌入式系统程序设计》第二周学习总结

本周我学习了gcc编译器、gdb调试器和make工程管理器方面的知识。

教材学习内容总结

一、gcc编译器

gcc 不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada 等多种语言,而且gcc 是一个交叉平台编译器,它能够在当前CPU 平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。

gcc编译流程

gcc 的编译流程分为了4 个步骤,以下是编译hello.c源文件得到hello可执行文件的过程:

步骤 操作 命令
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
也可以通过一条命令实现以上四个步骤:
gcc hello.c -o hello

静态库&动态库

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。

静态库

静态库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。创建及使用静态库的命令如下:

gcc -c hello.c -o hello.o
ar -rc libhello.a hello.o
gcc star.c libhello.a -o mystar
./mystar
动态库

动态库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。创建及使用动态库的命令如下:

gcc -c -fpic hello.c
gcc -shared -s -o libhello.so hello.o
sudo cp libhello.so /usr/lib6/
  //在运行可执行程序之前,需要注册动态库的路径名。其方法有几种:修改 /etc/ld.so.conf 文件,或者修改 LD_LIBRARY_PATH 环境变量,或者将库文件直接复制到 /lib 或者 /usr/lib 目录下(这两个目录为系统的默认的库路径名)。
  gcc -lhello star.c -o mystar
  ldd mystar
    //注册了动态库之后,上述两条命令才能执行成功,libhello.so才能在 /usr/lib/ 中
  ./mystar
两种库各自的优点

静态库:
(1)模块化,分工合作
(2)避免少量改动经常导致大量的重复编译连接
(3)也可以重用,注意不是共享使用
动态库:
(1)可以将最终可执行文件体积缩小
(2)多个应用程序共享内存中得同一份库文件,节省资源
(3)可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。

二、gdb调试器

gdb 调试器是一款GNU 开发组织并发布的UNIX/Linux 下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的Visual Studio 等工具媲美。

gdb基本命令

序号 功能 命令 备注
1 查看文件 l(list) 查看所载入的文件
2 设置断点 b 5 在第5行设置断点
3 查看断点情况 info b 查看所有的断点的设置情况
4 运行代码 r(run) 默认从首行开始运行代码,若想从程序中指定行开始运行,可在r 后面加上行号,运行到断点处停止
5 查看变量值 p+变量名 程序停止运行后,可查看变量值
6 单步运行 n/s 可单步执行以下代码(n和s区别见表下)
7 恢复程序运行 c 查看完所需变量及堆栈情况后,可恢复程序的正常运行
注意&技巧:
(1)单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别在于:若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。因此,“s”就类似于Uisual 等工具中的“step in”,“n”类似与Uisual等工具中的“step over”。
(2)利用行号设置断点是指代码运行到对应行之前将其停止,如输入 b 5 ,代码运行到第 5 行之前暂停(并没有运行第 5 行)。

三、make工程管理器

make 工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入makefile 文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。它大大提高了实际项目的工作效率,makefile 是make 读入的惟一配置文件。

make工程管理器的使用流程

以C语言为例:
(1)编写源文件
(2)编写 makefile 文件,它的格式为:

target: dependency_files
    command /* 该行必须以tab 键开头*/
     
/*例如*/
hello.o: hello.c hello.h
	gcc –c hello.c –o hello.o

(3)执行 make 命令,便可达到预期效果

makefile中的变量

,为了进一步简化编辑和维护makefile,make 允许在makefile 中创建和使用变量。变量是在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标体、依赖文件、命令以及makefile 文件中其他部分。
递归展开方式的定义格式为:VAR=var。
简单扩展方式的定义格式为:VAR:=var。
make 中的变量使用均使用的格式为:$(VAR)。
常用的变量表如下:

变量名 含义
CC C 编译器的名称,默认值为cc
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称

教材学习中的问题和解决过程

1、‘...’ is up to date

问题:

第二次执行 make 命令报错,出现以下信息:

解决过程:

询问老师,知道文件夹中已有同名文件,删除即可

代码调试中的问题和解决过程

1、#ifndef、#define、#endif的含义及作用。

问题:

在编写代码时遇到#ifndef、#define、#endif的含义及作用。

解决过程:

查找资料得到答案:

#ifndef 标识1 //判断"标识1"是否定义,如果被定义则返回假,如果没有被定义则返回真。
/**********************************/
语句1 #ifndef 标识1
语句2 #define 标识1
语句3 #endif
语句4 ……
语句5 ……

该段代码意思是:如果标识1没有被定义,则重定义标识1,即执行语句2、语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……

endif用于结束条件编译,编译时与前面最近的#if、#ifdef或#ifndef作为一对,经常一起使用,编译两者之间的部分程序段。

课后实验中的问题和解决过程

1、vim密码清除

问题:

编写makefile文件时,为了写变量名方便,打开了大写锁定,编写完保存退出时,误写了X(大写的X,意为加密、保存并退出),下次修改时,要输入密码。

解决过程:

上网查询资料后,找的解决方法:
前提必须知道自己设置的密码是什么,才能解除密码,有两种方法:
(1)底层命令模式输入 set key= 按下回车键。
(2)底层命令模式输入X(大写),再按两下回车键。

收获与总结

本周学习收获很多,对Linux下的编译系统有了更系统的了解。
(1)对gcc编译流程有了更深的理解,学会了同时对多个文件的编译。
(2)学会了gdb调试器对C语言的操作,其中可进入循环,查看每个变量在每次循环是的变量值,是一个很实用的技巧。
(3)掌握了makefile的基本工作原理,认识到设置并使用变量对编程效率的重大作用,更深的理解每个自动变量的含义,以及更熟练的使用它们是我还需要加强的地方。
(4)在实验时,对vim的操作和C语言的相关知识做了巩固和复习。
(5)写本篇随笔时,有两个表格都无法生成,只显示代码,我修改了多次,最好发现,用markdown插入表格时,正文下方必须空一行才可以生成表格,标题下方不用空行(插入代码块时也一样)。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38

参考资料

  • 《嵌入式应用程序设计》学习指导
posted @ 2017-05-01 11:45  舲舟聆雨  阅读(173)  评论(2编辑  收藏  举报