当前课程知识点:嵌入式系统设计 > 第四章:嵌入式软件开发平台 > 4.2 GCC 编译器 > 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 调试器
-5.1 Linux 设备驱动技术
--Video
-第五章:嵌入式Linux驱动开发--5.1 Linux 设备驱动技术
-5.2 Linux 设备驱动程序
--Video
-第五章:嵌入式Linux驱动开发--5.2 Linux 设备驱动程序
-实验一:基于ARM的嵌入式Linux开发环境建立
--Video
-第六章:嵌入式系统实验--实验一:基于ARM的嵌入式Linux开发环境建立
-实验二:基于ARM的模块方式驱动程序实验
--Video
-第六章:嵌入式系统实验--实验二:基于ARM的模块方式驱动程序实验