2014025659 《嵌入式程序设计》第二周学习总结
第2周主要学习内容
本周主要学习了对gcc、gdb、Makefile这几个命令的相关应用。
一、有关gcc
1、使用gcc编译器编译C语言程序文件生成可执行文件的过程,是要经历四个相互关联的步骤:
-Wall | 编译后显示所有警告 |
-w | 关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的 |
-W | 类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告 |
2、动态库和静态库
- 静态库的名字一般是
libxxx.a
- 动态库的名字一般是
libxxx.so
,有时候也是libxxx.so.major.minor
,xxx是该lib的名称,major是主版本号, minor是副版本号
如何判断一个程序有没有链接动态库
file命令:file程序是用来判断文件类型的,是什么文件一看都清楚明了。
ldd命令:看动态库,如果目标程序没有链接动态库,则打印“not a dynamic executable” (不是动态可执行文件)
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib
linux下库文件是如何产生的
静态库:静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
Step 2.ar命令将很多.o转换成.a,成文静态库
动态库:动态库的后缀是.so,它由gcc加特定参数编译产生。
使用方法例如
静态库:ar -rc libhello.a hello.o
动态库:gcc -fpic -shared -s hello.c -o libhello.so
二、有关gdb
- 编译时要加上 -g 才可以提供给gdb符号信息。
1.启动gdb:gdb mystargdb
2.执行文件:(gdb) run
3.显示执行文件全部代码:(gdb) list
或简写为(gdb) l
4.设置断点:(gdb) b n
(n为行号)
5.单步执行:(gdb) n
6.单步调试如果有函数调用,则进入函数:(gdb) s
(与命令n不同,n是不进入调用的函数的)
7.打印变量的值:(gdb) p
8.继续运行:(gdb) c
9.退出gdb:(gdb) q
三、有关Makefile
原理
Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。
makefile是make读入的唯一配置文件,其中有:
1.需要由make工具创建的目标体(target),通常是目标文件或可执行文件(有且仅有一个)
2.要创建的目标体所依赖的文件
3.创建每一个目标体需要运行的命令(command),这一行必须从制表符(tab键)开头
格式如下:
target:dependency -files
hello:hello.o
gcc -o hello hello.o
hello.o:hello.c
gcc -c hello.c
makefile中系统默认的自动变量:
$^:代表所有的依赖文件
$@:代表目标
$<:代表第一个依赖文件
实验楼实验结果
学习进度条
| | | | |
| -------- | :----------------😐:----------------😐:---------------: | :--------------: |
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 100/100 | 1/1 | 10/10 |复习了vim、gcc的相关知识|
| 第二周 | 300/500 | 1/2 | 18/28 | 学习了有关gcc、gdb、静态库和动态库、Makefile的相关知识及操作|