gcc编译选项

简介:

一、基本常用选项

gcc/g++ 在执行编译时,需要4步(-E,S,c,o选项只会出现一个,不会同时出现,一个都没有则默认为-o)

  1.预处理,生成.i的文件[使用-E参数]

  2.将预处理后的文件不转换成汇编语言,生成文件.s[使用-S参数]

  3.有汇编变为目标代码(机器代码)生成.o的文件[使用-c参数]

  4.连接目标代码,生成可执行程序[使用-o参数]

-E
  只激活预处理,这个不生成文件,你需要把他重定向到一个输出文件里面.
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
慢慢看吧,一个hello word 也要预处理成800行的代码

-S  只激活预处理和编译,就是指把文件编译成为汇编代码。

        # gcc -S hello.c
他将生成同名.S的asm文件

-c 只激活预处理,编译,和汇编,也就是他只把程式做成obj文件,而不进行链接;没有该选项还要进行链接

     # gcc -c hello.c
他将生成同名.o的obj文件

-o filename  激活预处理,编译,汇编和链接,指定生产可执行文件的名字。

 

gcc hello.c  (无选项)编译并链接hello.c(前边不带任何选项),默认为-o生成可执行程序名a.out

-I /dir/    指定编译时,包含的.h文件路劲,即在头文件的搜索路径列表中添加dir目录

              # gcc -I /dir/   hello.c  -o hello

-Llibpath (默认库usr/lib/:/lib)指定使用到的包含的库路劲,

              #gcc -I/home/foo -L/home/foo -ltest test.c -o test

-llibname 在链接时,指定具体的库  #gcc test.c -lm -o test  编译时链接名为libm.so的库

-static  静态链接(用于生成.ELF)。把库文件链接到.elf文件中(.a静态库,.so动态库;默认是动态链接)

             # gcc -static  hello.c -o hello.o

-shared (用于生成动态链接库.so)
  此选项将尽量使用动态库,所以生成文件比较小,不过需要系统由动态库

       .$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

-D MICRO  编译前,定义一个宏MICRO gcc -D YES  hello.c -o hello  相当于#define YES

-g 编译时,添加调试信息 gcc -g -c hello.c -o hello

-Wall 编译时生成所有的警告信息  gcc -Wall  hello.c -o hello

-w  编译时不生成任何警告信息  gcc -w  hello.c -o hello

-O0,-O1(-O),-O2,-Os,-O3 在编译时,对程序进行优化(gcc提供了5种不同的优化方式)

-pipe 使用管道代替临时文件

-x language filename
设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定,C语言的后缀名称是.c的,而C++的后缀名是.C或.cpp,如果你非常个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。能使用的参数有下面的这些:
`c’, `objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’, and `assembler-with-cpp’.
例子用法: cd..
gcc -x c hello.pig
-x none filename
关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
例子用法:
gcc -x c hello.pig -x none hello2.c

time ./hello  可以记录hello运行的时间

二、其他额外选项


gcc  --help 显示gcc帮助说明

-M 

告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个 源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件。生成的规则可 以是单行,但如果太长,就用`\'-换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序

-C 

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

-P 

告诉预处理器不要产生`#line'命令。配合`-E'选项使用。

-nostdlib 

不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。

 

Warnings

-Wall 

会打开一些很有用的警告选项,建议编译时加此选项。

-W 

-Wextra 

打印一些额外的警告信息。

-w 

禁止显示所有警告信息。

-Wshadow 

当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。

-Wpointer-arith 

对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。

-Wcast-qual 

当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。

-Waggregate-return 

如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。

-Winline 

无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。

-Werror 

把警告当作错误。出现任何警告就放弃编译。

-Wunreachable-code 

如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。

-Wcast-align 

一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。

-Wundef 

当一个没有定义的符号出现在 #if 中时,给出警告。

-Wredundant-decls 

如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别。


Optimization

-O0 

禁止编译器进行优化。默认为此项。

-O 

-O1 

尝试优化编译时间和可执行文件大小。

-O2 

更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。

-O3 

在 -O2 的基础上再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。

-Os 

对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。

-finline-functions 

把所有简单的函数内联进调用者。编译器会探索式地决定哪些函数足够简单,值得做这种内联。

-fstrict-aliasing 

施加最强的别名规则(aliasing rules)。


Standard

-ansi 

支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。

-std=c89 

-iso9899:1990 

指明使用标准 ISO C90 作为标准来编译程序。

-std=c99 

-std=iso9899:1999 

指明使用标准 ISO C99 作为标准来编译程序。

-std=c++98 

指明使用标准 C++98 作为标准来编译程序。

-std=gnu9x 

-std=gnu99 

使用 ISO C99 再加上 GNU 的一些扩展。

-fno-asm 

不把asm, inline或typeof当作关键字,因此这些词可以用做标识符。用 __asm__, __inline__和__typeof__能够替代它们。 `-ansi' 隐含声明了`-fno-asm'。
-fgnu89-inline 

告诉编译器在 C99 模式下看到 inline 函数时使用传统的 GNU 句法。


C options

-fsigned-char 

-funsigned-char 

把char定义为有/无符号类型,如同signed char/unsigned char。

-traditional 

尝试支持传统C编译器的某些方面。详见GNU C手册。

-fno-builtin 

-fno-builtin-function 

不接受没有 __builtin_ 前缀的函数作为内建函数。

-trigraphs 

支持ANSI C的三联符( trigraphs)。`-ansi'选项隐含声明了此选项。

-fsigned-bitfields 

-funsigned-bitfields 

如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域或无符号位域。缺省情况下,位域是有符号的,因为它们继承的基本整数类型,如int,是有符号数。

-Wstrict-prototypes 

如果函数的声明或定义没有指出参数类型,编译器就发出警告。很有用的警告。

-Wmissing-prototypes 

如果没有预先声明就定义了全局函数,编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这个选项 的目的是检查没有在头文件中声明的全局函数。

-Wnested-externs 

如果某extern声明出现在函数内部,编译器就发出警告。


C++ options

-ffor-scope 

从头开始执行程序,也允许进行重定向。

-fno-rtti 

关闭对 dynamic_cast 和 typeid 的支持。如果你不需要这些功能,关闭它会节省一些空间。

-Wctor-dtor-privacy 

当一个类没有用时给出警告。因为构造函数和析构函数会被当作私有的。

-Wnon-virtual-dtor 

当一个类有多态性,而又没有虚析构函数时,发出警告。-Wall会开启这个选项。

-Wreorder 

如果代码中的成员变量的初始化顺序和它们实际执行时初始化顺序不一致,给出警告。

-Wno-deprecated 

使用过时的特性时不要给出警告。

-Woverloaded-virtual 

如果函数的声明隐藏住了基类的虚函数,就给出警告。


Machine Dependent Options (Intel)

-mtune=cpu-type 

为指定类型的 CPU 生成代码。cpu-type 可以是:i386,i486,i586,pentium,i686,pentium4 等等。

-msse 

-msse2 

-mmmx 

-mno-sse 

-mno-sse2 

-mno-mmx 

使用或者不使用MMX,SSE,SSE2指令。

-m32 

-m64 

生成32位/64位机器上的代码。

-mpush-args 

-mno-push-args 

(不)使用 push 指令来进行存储参数。默认是使用。

-mregparm=num 

当传递整数参数时,控制所使用寄存器的个数。




本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1683116,如需转载请自行联系原作者

相关文章
|
3月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
27天前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
54 11
|
3月前
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
33 4
|
3月前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
81 0
|
5月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
|
5月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
157 0
|
5月前
|
C语言
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
|
6月前
|
编译器 Linux 开发工具
|
6月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
87 0
006.gcc编译器
|
6月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……