一、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)