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编译命令常用选项,布布扣,bubuko.com

时间: 2024-10-27 01:04:56

GCC编译命令常用选项的相关文章

【连接】gcc和gdb常用选项

gcc:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html#_Toc311642844 gdb:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2288004.html [连接]gcc和gdb常用选项,布布扣,bubuko.com

nmcli 命令常用选项

nmcli 命令常用选项 device选项: nmcli device show 显示信息 nmcli device disconnect IFACE 禁用指定设备 nmcli device connect IFACE 启用指定设备 nmcli device lldp list 列出通过LLDP协议发现的邻居设备 connection选项: nmcli connection show 显示连接的详细信息 --active 仅显示活动的连接 nmcli connection down IFACE

ps命令常用选项参数详解

PS命令是什么 ps命令能够给出当前系统中进程的快照.它能捕获系统在某一时间的进程状态.如果想要不断更新查看这个状态,可以配合watch命令或使用top命令.ps命令支持三种使用的语法格式 UNIX 风格:选项可以组合在一起,并且选项前必须有"-"连字符. BSD 风格 :选项可以组合在一起,但是选项前不能有"-"连字符. GNU 风格 :长选项,选项前需要有两个"-"连字符. ps命令基本选项及参数释义 a:显示现行终端机下的所有程序,包括其他

Gcc编译命令

完善gcc编译环境 Apt-get install gcc-multilib ? ? -static 静态编译 -z execstack 关闭栈不可执行保护 -m32 生成32位程序 -fno-stack-protector 不开启堆栈溢出保护,即不生成canary -mpreferred-stack-boundary=4 影响二进制文件中生成的代码,将堆栈指针对齐在四字节的边界上 -no-pie 关闭pie以避免基地址被打乱 还需要系统开启ASLR才会真正打乱基地址 /proc/sys/ker

gcc编译命令总结

一步到位编译:gcc hello.c -o hello 预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o 预处理 gcc -E hello.c -o hello.i -E:仅执行编译预处理 -o:将结果输出并指定输出文件的文件名 编译为汇编代码 gcc -S hello.c(.i) -o hello.s -S:将C代码转换为汇编代码 汇编: gcc -c hello.c -o hello.o -c:仅执行编译操作,不进行连接操作 连接: gcc hello.o -o h

smbpasswd命令常用选项

smbpasswd命令的常用方法 smbpasswd -a 增加用户(该账户必须存在于/etc/passwd文件中)smbpasswd -d 冻结用户,就是这个用户不能在登录了smbpasswd -e 解冻用户,让冻结的用户可以在使用smbpasswd -n 把用户的密码设置成空.             要在global中写入 null passwords -truesmbpasswd -x  删除用户

GCC 编译详解 (转)

朋友用C调用lua的库,但是不能直接调用源码,必须要编译成静态链接库才可以使用,问学长说是因为要分开编译链接.这就不理解了,于是转一篇讲编译的文章学习一下,补补课… GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Java.Fortran.Pascal.Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种

STLport-5.2.1 STL port配置; cl.exe 编译cpp:ms和cygwin两种模式;cygwin环境配置和使用、GCC编译入门

1.在ms中要使用windows sdk和相关的lib设置实在太麻烦啦,以及dll等文件缺失是在严重.所以我简单地利用了vs安装目录下的批处理文件,在命令窗口中进入: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC ,直接运行vcvarsall.bat加载vs中以及配置好的环境,就可以使用命令行: cl -GX hello.cpp去实现编译并运行.2012版本的vs中-GX换成-EHsc.同理我也可以使用vs2013.目前vs2013

linux(ubuntu)GCC编译包含库函数的问题

GCC 编译命令通常为:gcc hello.c -o hello.out 注意:若hello.c中引用有库函数(比如math.h),直接编译会出错 "/tmp/ccalvMPY.o: In function `main': /tmp/ccalvMPY.o(.text+0x40): undefined reference to `pow'" 原因:因为linux中, pow 函数定义在 libm.so中, 不像一般DevC++或TC是放在C语言的/lib下, 所以, C无法在连接时, 找