第5课 - 嵌入式 C 语言编译器

时间:2021-11-20 02:06:30

一、GCC与gcc的区别

GCC(GUN Compiler Collection): GUN编译器集合,包括众多的编译器(C,C++,Java,D,Object-C...)

gcc :特指GCC中的C语言编译器。


二、GCC与嵌入式的关系

大多数的嵌入式操作系统都是基于GCC进行源码编译的。(Linux,VxWorks,Andriod...)

实际开发中的使用:

内核开发 - gcc

应用开发 - gcc/g++/gdc(D语言)


三、什么是交叉编译?

背景:嵌入式设备往往资源受限,所以不可能直接在嵌入式设备上对处理器进行编程。

解决:在开发主机(PC)上对源码进行编译,将生成的目标主机(嵌入式设备)的可执行程序烧录到嵌入式设备上运行。


四、gcc是如何进行交叉编译的?

1、配置目标主机(嵌入式设备)的编译工具链(如:arm-linux-)

2、配置工具链的具体版本

     - 根据具体的目标代码选择相应的工具链版本

     - 正确使用关于硬件体系结构的特殊编译选项


五、案例(以大型企业嵌入式开发环境为例)

上层:(服务器集群)用于代码存储,版本控制,交叉编译,文件追踪等。

            所有的代码都在服务器存储的,交叉编译器也是在服务器存储的

下层:(代码编写环境Windows/Linux PC):这个PC可能是授权PC,就是微软定制版本的PC,只有授权的PC才能访问服务器,才能用于开发调试等。

当我们需要对代码更改编译的时候,我们PC上有一个终端程序,可以访问服务器将原有的代码copy一份,放到服务器中作者自己的仓库下面,供自己调试代码使用,而不影响原有的代码。复制好了之后,我们可以在终端敲命令来调用服务器上的交叉编译工具进行编译,编译好之后,可以将生成的可执行文件下载到PC上,然后烧写到嵌入式设备上进行测试。每个工程师copy的代码都有记录,这就是文件追踪。自己的代码改好之后,合并到服务器就会形成新的代码,每份代码都有不同的版本,这就是版本控制。

这就是现阶段大型企业的嵌入式开发环境。


六、C语言编译器

广义的C语言编译器包括:预处理器,编译器(狭义),汇编器,链接器。

例如: file.c file.h --> 预处理器 --> file.i --> 编译器 --> file.s --> 汇编器 --> file.o --> 链接器(动态链接和静态链接) --> a.out


七、扩展问题

如何理解“多语言混合开发”?


1、多语言混合开发方式一

X语言

Y语言    -->   目标平台汇编语言 --> 目标平台汇编器 --> 可执行程序

Z语言


行业案例: .net framework

C#

C++   --> MSIL(微软中间语言) -->  application

VB

.net framework这个框架可以使得多种开发语言开发的application能够执行相同的效果,这样一个好处就是如果开发一个应用程序需要使用C++语言,但是公司C++开发工程师不多,但是使用.net framework框架开发的话,C#工程师也可以开发出相同的应用程序,正好公司开发C#的工程师很多,这样就可以使用大量的C#和少量的C++工程师来共同完成项目的开发。


但是这对于嵌入式开发有什么关系呢?

Of course,对于嵌入式内核驱动的开发,那只能用C语言了,但是如果是嵌入式应用开发呢?如果你的目标硬件平台使用的是windows操作系统的话,太好了,直接下载.net framework就可以用多种语言开发了;如果是Linux系统的话,也没关系,现在的Linux系统已经支持.net framework开发的程序了。


2、多语言混合开发方式二

X语言 --> x.dll

Y语言  --> y.a       --->   目标平台链接器   --->  可执行程序

Z语言 -->  z.dll


行业案例:QQ

AppFramework.dll(腾讯自主研发的库)

zlib.dll(解压缩的库)                                    ---> QQ.exe

lua.dll

sqlite.dll



3、多语言混合开发方式三

X语言  -->  x.exe

Y语言  -->  y.exe     --->   进程间通信协议    --->   可执行程序

Z语言  -->  z.exe


行业案例:Eclipse

eclipse.exe--> 加载  --> App Entry(Jar Package)  Jre.exe 

                                                    |

                                                    ------>  依赖 ---> swt.jar        --->   依赖  ---> swt-xxx-win32.dll

                                                                                  jface.jar

                                                                                  core.jar


Question: What's the differences between the three methods above?

方式一:从语言到语言。

方式二:从语言到二进制文件

方式三:进程间通信



八、gcc关键编译选项

1、预处理指令 --- gcc -E file.c -o file.i

2、编译指令 --- gcc -S file.i -o file.s

3、汇编指令 --- gcc -c file.s -o file.o

4、生成映射文件 --- gcc -Wl, -Map=test.map file.c  (映射文件就是函数名,全局变量等的地址信息)

5、宏定义 --- gcc -D'TEST="test"' file.c

6、获取系统头文件路径  ---  gcc -v file.c

7、生成依赖关系 --- 获取目标的完整依赖关系 --- gcc -M test.c

                           --- 获取目标部分依赖关系    --- gcc -MM test.c

8、指定库文件及库文件搜索路径   ---  -L选项: 指定库文件搜索路径

                                                      ---  -l选项:指定库文件

                                                      ---  gcc test.c -L. -lfunc   (静态链接库为 libfunc.a)




(版权声明:本文内容归狄泰软件所有,博主整理所得,未经博主允许不得转载。)