GCC编译命令常用选项
GCC是GUN Compiler Collection的简称,除编译程序外,还包含其他相关工具。GCC可将高级语言编写的源代码构建成计算机直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,也是Linux平台编译器的事实标准。GCC支持四十余种不同目标体系结构(如X86系列、ARM及PowerPC等),可运行在不同的操作系统上(如Linux、Solaris及Windows等)。GCC既支持基于宿主的开发(即在A平台上编译该平台使用的程序),也支持交叉编译(即在A平台上编译供B平台使用的程序)。
GCC最初含义为GNU C Compiler。但目前除C语言外,GCC还支持多种其他语言,如C++、Ada、Java、Objective-C、FORTRAN、Pascal、COBOL以及支持函数式编程和逻辑编程的Mercury语言等。
对于GUN编译器而言,程序的编译经历预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly) 和链接(Linking)四个阶段。在预处理阶段,输入C语言源文件(通常为*.c),该阶段主要处理源文件中的#ifdef、 #include和#define命令,并生成中间文件*.i(实际中并不常用);在编译阶段,输入中间文件*.i,编译后生成汇编语言文件*.s;在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o;最后,在链接阶段将输入的机器代码文件*.o(与其它机器代码文件和库文件)汇集成一个二进制可执行代码文件。
实际操作上,GCC可将上述四步合并为一个步骤来执行。不同阶段的C语言文件输入输出如下图所示:

常用的GCC编译命令选项如下表所示:
表1 GCC编译命令常用选项
|
选项 |
描述 |
命令示例 |
|
无 |
将源文件预处理、编译、汇编并链接形成可执行文件 |
[e.g.1]gcc source.c 未指定输出文件时默认输出为a.out [e.g.2]gcc source.c -o exec 将源文件source.c链接为可执行文件exec [e.g.3]gcc test.o -o test 将编译输出文件source.o链接为可执行文件exec |
|
-E |
仅作预处理并直接显示,不进行编译、汇编和链接 |
[e.g.1]gcc -E source.c -o preproc.i 将源文件source.c预处理结果输出到preproc.i文件 [e.g.2]gcc -E source.c > preproc.txt 将source.c预处理结果重定向到preproc.txt文件 注:”gcc -E”也可换为”cpp”(C preprocessor) |
|
-S |
预处理和编译到汇编语言(自动生成.s文件),不进行汇编和链接 |
[e.g.1]gcc -S source.c 将源文件source.c汇编成source.s文件 [e.g.2]gcc -S preproc.i 将预处理输出文件preproc.i汇编成preproc.s文件 |
|
-c |
仅作预处理、编译和汇编并生成目标文件(与源文件同名但后缀为.o),不进行链接 |
[e.g.1]gcc -c source.s 将汇编输出文件source.s编译输出source.o文件 [e.g.2]gcc -c source.c -o target.o 编译源文件source.c并将目标文件更名为target.o |
|
-g |
产生带调试信息的编译后目标代码,供调试器(如gdb使用) |
默认产生gdb所用的调试信息,可用-gformat指定要生成的调试信息格式以供其他平台其他调试器使用 [e.g.1]gcc -g source.c 将源文件编译为带调试信息的目标文件a.out |
|
-o <OutFile> |
指定输出文件的文件名 |
[e.g.1]gcc -o source.exe source.c [e.g.2]gcc -o source.asm source.c |
|
-s |
剥除可执行文件中的符号表和重定位信息 |
用于减小可执行文件的大小 |
|
-C |
预处理时不删除注释信息 |
配合-E选项使用 |
|
-O |
使用编译优化级别1编译程序。O后还可附带其他的数值,表示不同的优化级别。级别越大优化效果越好,但编译时间越长 |
-O0:无优化(默认) 。 -O和-O1:优化可执行文件大小及执行时间,且不使编译时间明显增加。编译大型程序时会显著增加编译时内存的使用。 -O2:包含-O1的优化,并增加无需在目标文件大小和执行速度上进行折衷的优化。编译器不执行循环展开及函数内联,即不进行“空间换时间”的优化。该选项将增加编译时间和目标文件的执行性能。 -Os:执行所有不增加目标文件大小的-O2选项,并执行专门减小目标文件大小的优化选项。 -O3: 打开所有-O2优化选项并且增加 -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload和-ftree-vectorize优化选项。 [e.g.1]gcc -O1 source.c -o exec |
|
-shared |
生成共享目标文件 |
用于建立共享链接库 |
|
-w |
禁止显示任何警告信息 |
|
|
-Wall |
显示全部警告信息 |
|
|
-Wshadow |
当局部变量遮盖另一局部变量或全局变量时发出警告 |
比较有用,建议打开。 -Wall不会打开该项 |
|
-Wpointer-arith |
对函数指针或void *类型的指针进行算术操作时发出警告 |
比较有用,建议打开。 -Wall不会打开该项 |
|
-Werror |
把警告当作错误 |
出现任何警告就停止 |
|
-Wunreachable-code |
探测到永不执行的代码时发出警告 |
比较有用 |
|
-Wredundant-decls |
同一可见域内某定义多次声明时发出警告 |
即使这些重复声明有效且毫无差别 |
|
-pedantic |
对不符合 ANSI/ISO C标准且为标准所要求诊断之处发出警告 |
该选项可发现部分不符合ANSI/ISO C标准的代码,如C++ style comments are not allowed in ISO C90 |
|
-m |
生成文件关联的信息,包含目标文件所依赖的所有源代码 |
[e.g.1]gcc -m source.c 与-m类似的有: -mm忽略由#include <file>造成的依赖关系; -md将输出导入到.d的文件里; -mmd忽略由#include <file>造成的依赖关系,并将输出导入到.d的文件里 |
|
-v |
显示链接过程中编译器调用的程序 |
gcc编译链接生成执行文件时,自动把该文件代码作为第一个模块链接在可执行程序中 |
|
--help |
显示gcc帮助说明 |
|
|
--target-help |
显示目标机器特定命令行选项 |
|
|
--version |
显示gcc版本号和版权信息 |
GCC编译命令常用选项的更多相关文章
- GCC 编译命令
今天突然被同事问道一个GCC编译命令为的问题,感觉对相应内容生疏了,赶紧整理下相关内容,梳理下相关知识. GCC命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再 ...
- Linux C 程序 空语句-gcc编译命令(SIX)
C语言语句1.空语句:当一个if或者while判断部分能完成工作,空语句可以用来表示if或者while内的空循环体 if(a == b ); 2.gcc编译器 //程序的编译过程: // 预处理:pr ...
- 第七篇:gcc和arm-linux-gcc常用选项
目录 一.gcc和arm-linux-gcc的常用选项 二.从.c文件到可执行文件过程 一.gcc和arm-linux-gcc的常用选项 常用选型 -v 查看gcc编译器的版本,显示gcc执行时的详细 ...
- Linux gcc编译之-std选项
用GCC编译代码时候后面带有-std=c++1z 的选项,这是指定c/c++的标准.具体的标准如下,详细信息可以看引用里面的详细说明
- 附1 consul常用命令+常用选项
之后每用到一个command或options,都会记录在这里. 常用命令command: agent 作用:运行一个consul agent join 作用:将agent加入到consul clust ...
- gcc编译命令行依赖库的指定顺序
gcc链接过程中定义了三个集合:可重定位目标文件集合E.未解析符号集合U和已定义符号集合D,链接基本流程如下: 1) 按命令行指定顺序依次处理每个目标文件和库文件: 2) 如果为目标文件,将其加入集合 ...
- gcc编译命令总结
一步到位编译:gcc hello.c -o hello 预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o 预处理 gcc -E hello.c -o hello.i -E:仅 ...
- zip命令常用选项
大家都知道,在linux上一切皆文件,在实际生产环境中,如果我们需要部署一些系统的服务,我们会将一些软件包提前下载下来统一放到一个文件夹中, 然后将部署的过程用shell或者python写成一个脚本, ...
- smbpasswd命令常用选项
smbpasswd命令的常用方法 smbpasswd -a 增加用户(该账户必须存在于/etc/passwd文件中)smbpasswd -d 冻结用户,就是这个用户不能在登录了smbpasswd -e ...
随机推荐
- HTML5实现摇一摇的功能(实测后)--转
eviceMotionEvent(设备运动事件)返回设备有关于加速度和旋转的相关信息.加速度的数据将包含三个轴:x,y和z(示意如下图所 示,x轴横向贯穿手机屏幕或者笔记本键盘,y轴纵向贯穿手机屏幕或 ...
- JUnit4测试方法异常抛出实例
它用于测试由方法抛出的异常. import org.junit.*; /** * JUnit Expected Exception Test * @author yiibai * */ public ...
- jQuery/CSS3类似阿里巴巴的商品导航菜单实现教程
有两天没发表文章了,今天来说说利用jQuery和CSS3制作一款类似阿里巴巴左侧商品菜单导航,这款菜单看起来非常大气,可以展示非常多的产品类目,如果你在设计电子商务网站,不妨可以拿来参考,一下是效果图 ...
- 删除mac系统win10启动选择项
打开终端输入:diskutil list找到EFI这个分区,挂载EFI分区diskutil mount /dev/disk0s1 回到Finder 删除除apple之外的两个文件夹就可以了(删除win ...
- Java JVM运行时数据区,内存管理和GC垃圾回收
一 . 运行时数据区 程序计数器是线程私有的,是一块很小的内存空间,是当前线程执行到字节码行号的计数指示器.每个CPU处理器核心 在任何一个时刻,都只可能运行着唯一的一个线程,执行着一条指令.所以在多 ...
- android代码规范和studio配置CodeStyle
studio配置CodeStyle可以很好的帮助我们检测代码规范性,保持大家的代码统一,来看看怎么配置和使用吧 代码规范,自己公司的一套 代码规范 一. 简介 A. 目的 本文提供一整 ...
- OpenGL ES学习资料总结
从今年春节后开始学习OpenGL ES,发现网上资料很有限,而且良莠不齐,所以整理了一下我学习时用到的资料和一些心得. 1. OpenGL ES1.x参考资料 把NEHE的教程移植到了Android上 ...
- 【WP8】图片缓存控件
在做图片相关的应用的时候,经常需要用大图片的缓存,默认的Image控件不支持缓存的支持,本文自定义一个支持图片缓存的控件 当图片的地址是网络图片时候 根据Url判断该图片是否存在本地,如果存在,则直接 ...
- 在Unity3d中调用外部程序及批处理文件
如果调用外部普通应用程序, 比如notepad.exe 这样调用 static public bool ExecuteProgram(string exeFilename, string workDi ...
- 详解ABBYY FineReader 12扫描亮度设置
很多刚接触ABBYY FineReader 12的小伙伴可能出现过这样一个问题:在扫描过程中会显示一条消息以提示更改亮度设置.这是因为你 FineReader扫描设置中亮度未正确设置.下面小编就给小伙 ...