首页 > 代码库 > 2014025635《嵌入式程序设计》第二周总结

2014025635《嵌入式程序设计》第二周总结

1.课本学习总结

gcc编译器

GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac os x等)采纳为标准的编译器,GCC同样适用于微软的Windows。[2]  GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布。它是GNU项目中符合ANSI C标准的编译系统,能够编译用C,C++,Object C等语言编写的程序,gcc不仅功能强大,而且可以编译多种语言,并且它是一个交叉平台编译器,能够在当前CPU平台上为多种体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。

下表为gcc支持编译源文件的后缀及其解释

技术分享

技术分享

gcc编译流程解析

gcc编译流程分为四步,分别是预处理,编译,汇编,链接

我写了一个hello.c的源代码

#include<stdio.h>

int main(){

printf("hello word");

return 0;

}

(1)预处理阶段就是对包含的头文件(#include)和宏定义(#define)进行处理,在与处理中,编译器将包含的头文件stdio.h编译过来,我们可以使用gcc的选项“-E”进行查看,该选项的作用是让gcc在预处理停止编译过程

技术分享

技术分享

选项-o是指目标文件,.i文件就是已经预处理的文件,在下面列出了文件内容

技术分享

(2)编译阶段,gcc在这检查代码的规范性与是否有错误,没有问题后,就编译成汇编代码,使用“-S”查看汇编的代码

技术分享

技术分享

(3)汇编阶段,把编译阶段生成的文件转化成目标文件

(4)链接阶段,静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。

静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。

gcc编译选项

gcc选项

技术分享

库选项

技术分享

告警和出错选项

技术分享

gdb调试器

一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

make功能管理器

Make是GCC提供的一种半自动化的工程管理器。所谓的半自动化是指在使用工程管理器之前需要人工编写程序的编译规则,所有的编译规则都保存在makefile文件中,全自动化得工程管理器会在编译程序前自动生成makefile文件。

makefile中常见的预定义变量

技术分享

makefile中常见的自动变量

技术分享

makefile规则

在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...
command
...
...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签
(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisi
tes中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一
个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是 Makefi
le的规则。也就是Makefile中最核心的内容。

makefile管理器的使用

使用makefile管理器非常简单,只需在make后面键入目标名即可建立目标,直接运行make,就会建立makefile第一个目标

make的命令行选项

技术分享

 

2014025635《嵌入式程序设计》第二周总结