陈奇网络工作室

嵌入式C语言编译器(5)

系统运输

GCC和GCC在嵌入式开发中很常见,其区别是什么呢? gnucompilecollection ( gcc )是GNU编译器的集合,包含多种语言的编译器,如c、c、Java、d和Objective-C。 另一方面,gcc特别是gcc中的c语言编译器。 GCC与嵌入式的关系如何? 许多嵌入式操作系统基于GCC (如Linux、VxWorks和Android )编译源代码。 在实际的开发中,在内核相关的开发中使用gcc,而在APP应用开发中使用gcc/g /gdc等。

让我们来看看高端大气层面在嵌入式开发中的措辞。 是交叉编译。 那么为什么会有交叉编译呢? 传统的嵌入式设备往往资源有限,无法直接在嵌入式设备上对处理器进行编程。 在这种情况下,解决方案是在开发主机( PC )上编译源代码,并最终为目标主机(嵌入式)生成可执行文件。 gcc是如何交叉编译的呢? 1、在目标主机上配置编译工具链(例如arm-linux ); 2、配置工具链的具体版本:根据具体目标代码选择合适的工具链版本,正确使用硬件体系的特殊编译选项。 接下来,我们来看看大型企业的嵌入式开发环境。 如下所示

此服务器群集相当于我们的内部服务器,版本控制是指原始版本经过我们几个代码的修改后产生的新版本,用于控制每个版本。 所谓文件跟踪,就是在服务器上可以看到该部分的代码具体是谁改写的,具体可以到达文件和部分代码。 让我们看看编译器的情况。 这将是:

编译器由预处理期、编译器、汇编程序和链接器组成。 通常,哪个编译器编译生成的文件是指大范围的编译器。 狭义的编译器是指生产我们平时听到的语言的编译器,这种情况下的编译器是指将具体的语言翻译成目标平台代码。 让我们看看. c文件是如何编译成. o文件的。 具体步骤如下

我们发现,没有像我们想象的那样直接从. c文件编译成. o可执行文件,而是经过很多步骤来生成最终的可执行文件。 那么,扩展一下如何理解“多语言混合开发”的问题。 通常,您可能听说多语言混合开发是指将多种语言混合在一起开发一个APP应用程序。 那么,为什么会产生这种混合的开发方式呢? 例如,某个项目在c完成,但其中一部分可以在C#完成。 这个时候,很少有人熟悉C。 相应地工资会变高。 另一方面,因为有很多C#的工程师,所以我们可以让两个熟悉C的工程师和多个C#的工程师共同完成这个项目,用最少的开支完成这个项目。 或者你们小组内擅长的语言方向不同,所以为了发挥每个人的最大效率可以采用这种混合开发方式。 让我们来看看几种多语言混合开发方法

方式一、如下

该方式得到用几种语言汇编的目标平台的汇编语言,通过目标平台的汇编程序统一链接生成可执行程序。 业界的典型事例是. net framework,这是通过C#、c、VB的混合开发得到的,如下所示

方式二、如下

它以每种语言生成相应的库,并通过目标平台链接器统一链接到可执行文件。 典型的例子是QQ。 如下

方式三、如下

它经过各自的编译器老师成为可执行程序. exe,通过进程间通信协议生成可执行程序。 行业案例: Eclipse,如下

让我们看看gcc的主要编译选项。

gcc密钥编译选项1:a预处理指令由gcc -E file.c -o file.i; b编译命令: gcc -S file.i -o file.s; c汇编命令: gcc -c file.s -o file.o。

让我们看看效果是什么样的

func.h源代码

#includestdio.h

voidfunc ( ) )

{

#ifdefTEST

printf(TEST=%s\\\n& #039; test );

#endif

返回;

}

test.c源代码

#includestdio.h

#include& #039; func.h& #039;

intg_global=0;

intg_test=1;

intmain(intargc,char*argv[] ) ) ) ) ) ) ) ) ) int main ) ) ) int main ) ) ) int argc,char*argv[] ) ) ) ) ) ) ) int

{

func (;

printf(g_global=%p\\\n& #039;g_global );

printf(g_test=%p\\\n& #039;g_test );

printf(func=%p\\\n& #039;func );

printf(main=%p\\\n& #039;main );

返回0;

}

看看预处理的效果吧。 打开test.i文件看看。 开头是这样的

第一行中的1表示以下内容属于test.c文件,并且包含头文件的一部分:

# 2 & #039; test.c& #039; 2意味着test.c头文件的包含已经结束,# 1 & #039; func.h& #039; 1意味着func.h相关内容的开始。 最后,是test.c文件中main函数的内容。 查看编译命令生成的. s文件

生成的汇编命令。 尝试用最后的汇编指令生成. o文件

gcc密钥编译选项2 :生成a映射文件: gcc -WI,-Map=test.map file.c; b宏的定义: gcc -D& #039; TEST=& #039; test& #039; & #039; file.c; c系统头文件的路径:获取gcc -v file.c。

gcc密钥编译选项3 :生成依赖关系。 a获得目标的完全依赖关系: gcc -M test.c; b获得目标的部分依赖关系: gcc -MM test.c。

现在我们来看看-M和-MM的效果分别是什么样的。 如下所示

我发现它包含许多格式类似于makefile目标和依赖关系的头文件。 其中的依赖项是test.c和许多头文件以及我们自己包含的func.h头文件。 -看看mm的效果吧

-MM的效果是依赖于test.c和func.h,没有其他头文件。

gcc密钥编译选项4 :指定库文件和库文件的搜索路径。 -L选项是指定库文件的搜索路径。 -l是指定库文件,例如gcc test.c -L -lfunc。

func.c源代码

#includestdio.h

voidfunc ( ) )

{

#ifdefTEST

printf(TEST=%s\\\n& #039; test );

#endif

返回;

}

test.c源代码

#includestdio.h

intg_global=0;

intg_test=1;

intmain(intargc,char*argv[] ) ) ) ) ) ) ) ) ) int main ) ) ) int main ) ) ) int argc,char*argv[] ) ) ) ) ) ) ) int

{

func (;

printf(g_global=%p\\\n& #039;g_global );

printf(g_test=%p\\\n& #039;g_test );

printf(func=%p\\\n& #039;func );

printf(main=%p\\\n& #039;main );

返回0;

}

编译结果如下

使用ar crs命令将func.o打包为libfunc.a文件,然后看到使用gcc test.c -L. -Lfunc命令生成可执行文件a.out。 -l之后的点位于当前目录下。

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3