gcc 编译
一、基本常用选项
gcc hello.c (无选项)编译并链接hello.c(前边不带任何选项),默认生成可执行程序名a.out
-o filename 指定生产可执行文件的名字
-I /dir/ 指定编译时,包含的.h文件路劲,即在头文件的搜索路径列表中添加dir目录 gcc -I /dir/ hello.c -o hello
-Llibpath (默认的库位于usr/lib/下)指定使用到的包含的库的路劲,即在库文件的搜索路径列表中添加dir目录 gcc -I/home/foo -L/home/foo -ltest test.c -o test
-llibname 在链接时,指定具体的库 $ gcc test.c -lm -o test 编译时链接名为m的库
-static 把库文件静态链接到.elf文件中(.a静态库,.so动态库;默认是动态链接) gcc -static hello.c -o hello.o
-Wall 编译时生成所有的警告信息 gcc -Wall hello.c -o hello
-w 编译时不生成任何警告信息 gcc -w hello.c -o hello
-D MICRO 编译前,定义一个宏MICRO gcc -D YES hello.c -o hello 相当于#define YES
-g 编译时,添加调试信息 gcc -g -c hello.c -o hello
-c 只编译.c文件生成.o目标代码而不进行链接。驱动程序就只用生成一个.o文件
-O0,-O1(-O),-O2,-Os,-O3 在编译时,对程序进行优化(gcc提供了5种不同的优化方式)
-pipe 使用管道代替临时文件
-S 仅编译到汇编语言,不进行汇编和链接。
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
当传递整数参数时,控制所使用寄存器的个数。
本文出自 “tech记录” 博客,谢绝转载!
原文地址:http://a1liujin.blog.51cto.com/5519498/1683116