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

第2周主要学习内容

本周主要学习了对gcc、gdb、Makefile这几个命令的相关应用。

一、有关gcc

1、使用gcc编译器编译C语言程序文件生成可执行文件的过程,是要经历四个相互关联的步骤:

![](http://images2015.cnblogs.com/blog/1150161/201705/1150161-20170502115141664-461064443.jpg)
- 在预处理阶段,输入的是C语言的源文件,通常为```*.c```。它们通常带有.h之类头文件的包含文件。这个阶段主要处理完成源文件中的诸如```#ifndef、 #include、#define```的编译与处理指令。该阶段会生成一个中间文件```*.i```。代码如下:```gcc -E hello.c -o hello.i``` - 在编译阶段,输入的是中间文件```*.i```,编译后生成汇编语言文件```*.s```。代码如下:```gcc -S hello.i -o hello.s ``` - 在汇编阶段,将输入的汇编文件```*.s```转换成机器语言```*.o```。代码如下:```gcc -c hello.s -o hello.o``` - 最后,在链接阶段将输入的机器代码文件```*.s```(与其它的机器代码文件和库文件)汇集成一个可执行的机器代码文件。代码如下:```gcc hello.o -o hello ``` 从功能上分,预处理、编译、汇编是三个不同的阶段,但gcc的实际操作上,它可以把这三个步骤合并为一个步骤来执行。代码如下:```gcc -c hello.c -o hello.o``` #### *有关gcc的警告命令*
-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的相关知识及操作|

posted on 2017-05-02 13:28  愚yyy  阅读(159)  评论(0编辑  收藏  举报