首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» GCC编译器使用
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
GCC编译器使用
发短消息
加为好友
yuyang911220
当前离线
UID
1029342
帖子
9914
精华
0
积分
4959
阅读权限
90
在线时间
286 小时
注册时间
2014-5-22
最后登录
2017-7-24
论坛元老
UID
1029342
性别
男
1
#
打印
字体大小:
t
T
yuyang911220
发表于 2016-8-5 17:43
|
只看该作者
GCC编译器使用
嵌入式开发
,
计算机
,
源代码
,
编译器
,
二进制
一、GCC简介通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用,是因为它能支持各种不同的目标体系结构。例如,它既支持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也支持交叉编译(即在A平台上编译的程序是供平台B使用的)。目前,GCC支持的体系结构有四十余种,常见的有X86系列、Arm、PowerPC等。同时,GCC还能运行在不同的操作系统上,如Linux、Solaris、Windows等。
除了上面讲的之外,GCC除了支持C语言,还支持多种其他语言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。
GCC的安装:
Ubuntu等基于Debian发行版Linux可以使用如下命令安装:
apt -get install gcc
Fedora等基于RPM发行版Linux可以使用如下命令安装:
yum install gcc
使用如下命令查看gcc的版本:
gcc --version
二、程序的编译过程对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:
从功能上分,预处理、编译、汇编是三个不同的阶段,但GCC的实际操作上,它可以把这三个步骤合并为一个步骤来执行。下面以C语言为例来谈一下不同阶段的输入和输出情况。
GCC编译器的基本选项如下表:
类型
说明
-E
预处理后即停止,不进行编译、汇编及连接
-S
编译后即停止,不进行汇编及连接
-c
编译或汇编源文件,但不进行连接
-o file
指定输出文件file
在预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的示例命令:
gcc -E test.c -o test.i
在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:
gcc -S test.i -o test.s
在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:
gcc -c test.s -o test.o
最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:
gcc test.o -o test
运行如下:
可以通过:cat -n [filename]命令查看每一个阶段的文件内容
上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。
三、警告选项GCC提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告
GCC的编译器警告选项如下表:
类型
说明
-Wall
启用所有警告信息
-Werror
在发生警告时取消编译操作,即将警告看作是错误
-w
禁用所有警告信息
实例1:给出一段代码,使用gcc进行编译,同时开启警告信息(test1.c)
#include<stdio.h>int main(){ int i; for(i = 0; i <= 3; i++) printf("hello gcc!\n"); //return 0;}
使用-Wall开启警告:
从上面可以看出,GCC给出了警告信息,意思是main函数的返回值被声明为int,但是没有返回值,GCC并不是简单的发出警告,会中断整个编译过程
如果不想看到警告信息,可以使用-w来禁止所有的警告。
此外,GCC还提供了许多以-W开头的选项,允许用户指定输出某个特定的警告,例如:
-Wcomment:出现注释嵌套时发出警告。
-Wconversion:如果程序中存在隐式类型转换,则发出警告。
-Wformat:检查printf和scanf等格式化输入输出函数的格式字符串和参数类型的匹配情况,如果发现不匹配则发出警告。
-Winline:如果函数不能被内联,则发出警告。
-Wlong-long:如果使用了long long型数据,则发出警告。
-Wmain:如果main函数的返回类型不是int型,或者调用main函数时使用的参数数目不正确,则发出警告。
-Wmissing-declarations:如果定义了全局函数,但却没有在头文件中声明,则发出警告。
-Wparentheses:在某些情况下,如果忽略掉了括号,则会发出警告。
-Wreturn-type:如果函数定义了返回类型,而默认类型是int型,编译器会发出警告。
-Wuninitialized:如果使用的自动变量没有被初始化,则发出警告。
-Wundef:如果在#if宏中使用了未定义的变量做判断,则发出警告。
-Wunused:如果声明的变量或static型函数没有使用,则发出警告。
实例2:给出一段代码,使用gcc进行编译,同时开启警告信息(test2.c)
#include<stdio.h>int main( ){ int a = 1; int b = 0; int c = 1; if(a && b || c) { ; } if(a == 1) if(b == 1) printf("b = 1\n"); else printf("b != 1\n"); return 0;}
使用-Wparentheses开启警告:
收藏
分享
评分
继承事业,薪火相传
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议