当前课程知识点:嵌入式系统设计 >  第四章:嵌入式软件开发平台 >  4.2 GCC 编译器 >  Video

返回《嵌入式系统设计》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《嵌入式系统设计》慕课在线视频列表

Video课程教案、知识点、字幕

GCC是linux平台下最常用的编译程序

在linux平台的嵌入式开发领域,它也用得非常普遍

目前,GCC支持的体系结构

常见的有X86、Arm、PowerPC,可以有40多种

支持的操作系统常见的linux、windows

在gcc编译器里面,它有一个文件约定

对于扩展名是.c的,就约定是C语言源程序

.cc的就是C++,.i 的是预处理后的C语言源程序

.s 就是预处理后的汇编程序, .o就是目标文件,.h头文件

.a是静态库文件, .so是动态库文件

GCC的总体编译选项:

其中-c是只编译不连接,它生成的是目标文件,

也是二进制文件但是不能执行

-S是只编译不汇编,生成的文件是汇编代码

-E只进行预编译,不作其他处理

也就是它只进行头文件等等一些定义处理

-g就是可执行程序中包含标准的调试信息;-o就是指定输出文件

Gcc的编译过程主要分为4个过程:预处理,编译,汇编和链接

在gcc下面分别用到的子程序是cpp、ccl、as和ld

比如这样一个例子:printf(“Hello GCC world”)这样一个简短程序

我们要编译它的话,就使用gcc hello.c -o hello

(就是表明输出的可执行文件是hello)

那么编译通过之后产生hello这个可执行文件

我们执行它,这就是结果

GCC的编译过程,我们刚才所说的这4个阶段,我们分别来看一下

-E的话就是只进行预处理,那么加上-E的选项此时输出的是hello.i

也就是说是包含头文件的预处理的相关信息的这个文件

我们可以看看结果,如果是用的-S这个选项

那么输出hello.s此时产生的是汇编源文件hello.s

如果是-c的选项呢,输出的是.o,.o也是目标文件

那么这个是二进制文件我们看不了它

如果是最后的链接阶段,我们就不带任何选项

直接输出hello就行

我们可以通过file来看hello的属性

GCC编译器还有警告提示功能:

警告提示就是说,如果检查出错误的话,就会中止编译,

但是检测到警告的时候呢却继续编译生成可执行文件

也就是说警告只是针对程序结构的诊断信息

不能说明程序一定有错误

那么警告选项,常见的有-ansi也就是符合ansi标准的c程序

我们最常用到的是下面这个:-Wall

是允许GCC提供所有有用的报警信息

那么比如我们有这样一段代码,

这段代码实际上和标准C相比是有些差别的

我们通过不同的编译选项

这里的pedantic,Wall等等来编译这个文件产生对应的代码

可以看到会输出不同的警告信息

再下一个,代码的优化

代码优化是指编译器通过分析源代码,找出其中尚未达到最优的部分

对其重新进行组合,改善程序的执行性能

那么也就是说,代码优化是编译器所做的工作

在GCC中提供的代码优化功能可以通过编译选项-On来控制

这个n,实际上是一个整数,代表的是优化级别

其中-O1能进行的优化主要是包括线程跳转和延迟退栈等等

-O2,那么除了-O1级别的优化,还有可进行一些额外的调整工作

比如说处理器的指令调度

-O3在-O2的基础上还包括循环展开

和其他一些与处理器特性相关的优化工作

这段代码我们可以用作代码优化的例子

为什么可以优化?

这里有一个数量非常大的循环,在循环里面有一个除法

这个就是我们能够优化的基础

在优化的过程中,首先比较一下不加任何优化选项的

执行这样一个编译,然后运行这个程序,统计它的运行时间

可以看得到最后的运行时间是1分多,相对应地我们加上优化选项

比如说在这个编译过程中加了-O,然后我们生成的可执行程序

统计它的运行时间,可以看到它的时间大大缩短了

最后一点,我们看一下库依赖

从编程的角度来看,函数库实际上就是一些头文件和库文件的集合

在编译的过程中有库依赖的话实际上就是包含这些头文件和库文件

包含头文件,就用-I加上路径,来搜索对应的头文件

对库文件,就-L加上对应的搜索路径

如果连接的是静态库,我们用-static

如果是一定要指明库文件,就用-l加上库名的这样一个选项

在linux下,库文件分为两大类,动态链接库,以.so结尾

静态链接库,以.a结尾

默认的情况下,GCC在链接的时候优先使用动态链接库

只有动态链接库不存在的时候才使用静态链接库

如果想直接使用静态链接库,那直接加上-static这个选项就行了

这就是一个使用静态链接库的例子我们看一下:

我们编译的stream.c这个找寻库的路径

然后链接一个叫stream的静态库

嵌入式系统设计课程列表:

第一章:嵌入式系统基础

-1.1 嵌入式系统概念

--Video

-第一章:嵌入式系统基础--1.1 嵌入式系统概念

-1.2 嵌入式系统组成

--Video

-第一章:嵌入式系统基础--1.2 嵌入式系统组成

第二章:嵌入式处理器

-2.1 嵌入式处理器发展历史

--Video

-第二章:嵌入式处理器--2.1 嵌入式处理器发展历史

-2.2 三星S3C2440 微处理器

--Video

-第二章:嵌入式处理器--2.2 三星S3C2440 微处理器

第三章:嵌入式操作系统

-3.1 嵌入式操作系统概述

--Video

-第三章:嵌入式操作系统--3.1 嵌入式操作系统概述

-3.2 嵌入式Linux 操作系统

--Video

-第三章:嵌入式操作系统--3.2 嵌入式Linux 操作系统

-3.3 Linux 操作系统实时性改造

--Video

-第三章:嵌入式操作系统--3.3 Linux 操作系统实时性改造

第四章:嵌入式软件开发平台

-4.1 基于Linux的开发流程

--Video

-第四章:嵌入式软件开发平台--4.1 基于Linux的开发流程

-4.2 GCC 编译器

--Video

-第四章:嵌入式软件开发平台--4.2 GCC 编译器

-4.3 GDB 调试器

--Video

-第四章:嵌入式软件开发平台--4.3 GDB 调试器

第五章:嵌入式Linux驱动开发

-5.1 Linux 设备驱动技术

--Video

-第五章:嵌入式Linux驱动开发--5.1 Linux 设备驱动技术

-5.2 Linux 设备驱动程序

--Video

-第五章:嵌入式Linux驱动开发--5.2 Linux 设备驱动程序

第六章:嵌入式系统实验

-实验一:基于ARM的嵌入式Linux开发环境建立

--Video

-第六章:嵌入式系统实验--实验一:基于ARM的嵌入式Linux开发环境建立

-实验二:基于ARM的模块方式驱动程序实验

--Video

-第六章:嵌入式系统实验--实验二:基于ARM的模块方式驱动程序实验

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。