gcc是“GNU Compiler Collection”的缩写,从字面意思可以知道它是一个编译器集。gcc不止可以编译器c语言,还能用于c++,java,object-C等语言程序。但是在这里,我们的嵌入式学习中,目前只去关注gcc在C语言方面的编译功能。

.什么是交叉编译器

  在嵌入式系统开发中,经常用到与交叉编译相关的术语,例如:交叉编译器,交叉连接器,交叉编译环境等。

  嵌入式产品的资源往往有限,如果它的资源和我们平时用的桌面计算机(后面称为开发主机或简称主机,host machine)一样,那就不需要交叉编译了。嵌入式系统的内存通常是几十兆字节,且只有闪存而没有硬盘这种大容量存储设备。在这种资源有限的环境中,不可能将开发工具安装在嵌入式设备中(后面称为目标机,target machine),然后像平时做桌面软件开发那样在嵌入式设备上直接进行软件开发,因此,嵌入式的开发工作一般是在主机上进行的。

  那么当目标机的处理器和主机的处理器不同时(比如目标机是ARM处理器,而主机是X86处理器),如何保证在主机上编译的程序可以在目标机上运行呢?

  当使用编译gcc时,需要指定目标机处理器和主机处理器型号,如果不加以指定,则认为主机与目标机是一样的,且与当前编译它的环境一致。如果在gcc编译时,指定主机与目标机处理器型号不一致,则生成的编译器就是交叉编译器(cross compiler),即生成的编译器将在指定主机上进行编译活动,但在编译器生成的程序却运行于目标机上。

gcc会对代码完成预处理,编译,汇编和链接四个步骤。

这里注意:汇编文件的后缀是s(小s)表示:在后期阶段不在进行预处理操作,所以我们不能在这里面写预处理的语句在里面;汇编文件的后缀是S(大S)表示:会进行预处理、汇编等操作,所以我们可以在这里面加入预处理的命令。

gcc实用选项:

-S:生成汇编

-I:指定头文件路径

-g:包含调试信息

-On:n=0~3,编译器优化,n越大优化等级越高

-Wall:提示更多的警告信息

-D:编译器时定义宏,注意-D和宏之间没有空格

-E:生成预处理文件

-c:只编译,不链接

-C 告诉预处理器不要丢弃注释。配合`-E'选项使用。

-M:生成与.c和头文件的依赖关系以用于Makefile,包括系统库的头文件

-MM:生成与.c和头文件的依赖关系以用于Makefile,不包括系统库的头文件

-o:生成目标文件。eg: -o filename。将经过gcc处理的结果保存为filename。如果这个选项被忽略,生成的可执行文件默认为a.out,,假设源文件为file.c,目标文件默认为file.o,汇编文件默认为file.s。

gcc -v可以查看gcc的版本信息,但是要是在gcc -v 后面加上一个源文件例如,gcc -v main.c,这样可以获得gcc所使用的系统头文件。

加上源文件选项 :

产生映射文件

gcc的-Wl选项用于指定传递给连接器的选项,-Map=main.map选项由gcc传递给连接器以只是连接器为我们生成名为main.map的映射文件。在使用-Wl选项时,如果后面的选项如有多个,则需要用逗号分开。

映射文件除了包含nm工具获取的信息外,还包含了各符号来源于哪一个库以及库中的哪一个目标文件等更为详细的信息。

在链接选项中:

参考链接:http://blog.chinaunix.net/uid-20528014-id-358180.html

gcc,一个神奇的编译器的更多相关文章

  1. 第一个C语言编译器是怎样编写的?

    首先向C语言之父Dennis MacAlistair Ritchie致敬! 当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jython等是基于J ...

  2. modifytime是一个神奇的column name----这边文章是错的totally,因为我的实验不彻底。timestamp属性很神奇,头一个timestamp,会自动的成DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    在mysql里边modifytime是一个神奇的column name,试一下. 请执行sql语句 CREATE TABLE `test_time` ( `modifytime` timestamp ...

  3. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

  4. 一个神奇的???whatever~~

    一个神奇的类,用来封装消息数据,统一数据传递接口,从unity引擎源码拷贝而来. #include <iostream> #include <assert.h> #includ ...

  5. 我发起并创立了一个 C 语言编译器 开源项目 InnerC

    本文是 VMBC / D#  项目 的 系列文章, 有关 VMBC / D# ,  见 <我发起并创立了一个 VMBC 的 子项目 D#>(以下简称 <D#>)  https: ...

  6. 记一个神奇的WAS问题:sibuswsgw-sibuswsgw_console.jar invalid LOC header (bad signature) 分类: WebSphere 2015-08-06 23:21 9人阅读 评论(0) 收藏

    今天晚上,出现了一个神奇的WAS问题,详细问题异常信息如下: [15-8-6 22:13:29:146 CST] 00000013 ApplicationMg A WSVR0203I: 应用程序:is ...

  7. 微信图片上传,遇到一个神奇的jgp

    微信图片上传,获取图片base64遇到一个神奇的   jgp var imgFn = function (event) { event.preventDefault(); var id = '#'+$ ...

  8. JS高级---一个神奇的原型链

    一个神奇的原型链 <script> var divObj=document.getElementById("dv"); console.dir(divObj); //d ...

  9. Bugku-CTF之这是一个神奇的登陆框

    Day32 这是一个神奇的登陆框 http://123.206.87.240:9001/sql/ flag格式flag{}  

随机推荐

  1. jquery获取一组相同标签内没有class的标签

    $("ul>li[class!='pre'][class!='nex']").each(function(i){ $(this).html(i); });

  2. vue中引入第三方字体图标库iconfont,及iconfont引入彩色图标

    iconfont字体图标使用就不多说了,大致是几部: 1.在iconfont官网选图标,加入购物车,加入项目,下载到本地,解压 2.在项目assets目录新建目录iconfont,用于存放刚才下载解压 ...

  3. 寻找i*j=m的个数

    问题描述 3*3的矩阵内容. 1 2 3 2 4 6 3 6 9 即a[i][j](1<=i<=n,1<=j<=n)=i*j. 问一个这样n*n的矩阵里面,里面m出现的次数. ...

  4. elasticsearch java客户端api使用(一)

    1.客户端client构建 ​ package com.pz998.app.service.utils; import static org.elasticsearch.common.settings ...

  5. 2013年八月GBin1月刊

    2013年八月GBin1月刊 推荐十款来自极客标签的超棒前端特效[第十二期] 本周,我们带来了极客社区推荐的10款前端特效,仍然是非常有趣的小动态效果的页面生成.喜欢的可以直接将我们的在线调试代码插入 ...

  6. PHP和数据访问之(插入。删除。和更新数据)

    插入: <?php $conn=@new mysqli('localhost','root','123','mytestdb'); $q_str=<<<EOM insert i ...

  7. CCF-201512-3 绘图

    问题描写叙述 用 ASCII 字符来绘图是一件有趣的事情.并形成了一门被称为 ASCII Art 的艺术.比如,下图是用 ASCII 字符画出来的 CSPRO 字样. .._._.._.._-_.. ...

  8. <c:forEach items="${revertList}" varStatus="reverts" var="revert" > <dl >

    <c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的 ...

  9. 【VB编程】05.MsgBox与InputBox函数

    在VBA程序中,数据的输入输出是通过函数实现的,其实现的方式是通过对话框的形式表示出来的.例如MsgBox,Inputbox等,不要误认为是输入输出语句的关键字,其实仅仅是一个普通函数而已. [Msg ...

  10. 分享几款流行的Java框架

    虽然Java一直被唱衰,但是直到现在Java软件开发也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,下面分享几个个人认为还不错的Java框架,以及各自的优缺点,希望能对大家有帮助. ...