1. 一般选项 Overall Option
选项作用
-v打印命令到stderr
-E要求gcc仅作预处理,不进行编译、汇编和链接。
-c编译、汇编到目标代码,不进行链接。
-o输出到指定文件。如果没有指定,则输出到a.out。

-v 会打印编译过程的详细信息,如完全的编译选项(包括gcc内部添加的编译选项),如头文件目录的搜索顺序等。

2. 语言选项 Language Option
选项作用
-std=编译时遵循的语言标准,目前支持C/C++,如c99, c++0x等。
3. 目录选项 Directory Option
选项作用
-ldir把dir加入到搜索头文件的路径列表中。
-Ldir把dir加入到搜索库文件的路径列表中。
4. 预编译选项 Preprocessor Option
选项作用
-Dname=definition定义预编译宏,名字name,值definition。
-Dname定义预编译宏,名字name,值为1。
-M告诉预处理器输出一个make rule,描述源代码文件依赖哪些文件。
5. 链接选项 Linker Option
选项作用
-lx进行链接时搜索名为的库
-shared生成动态库
-static生成静态库
-rdynamic链接器将所有符号添加到动态符号表中,方便dlopen()等使用。
-s去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。
  • -rdynmaic 传递 -export-dynamic 给链接器,连接器将把所有的符号加入动态符号表(dynamic symbol table), 。这是调试dlopen()加载的模块时需要的。不指定则连接器会删除不使用的符号。
6. 代码生成选项 Code Generation Option
选项作用
-fPIC编译动态库时,要求产生与位置无关代码(Position-Independent Code)
-fvisibility=default | hidden默认情况下,设置ELF镜像中符号的可见性为public或hidden
  • -fvisibility=hidden可以显著地提高链接和加载共享库的性能,生成更加优化的代码,提供近乎完美的API输出和防止符号碰撞。强烈建议在编译共享库的时候使用它。

    • -fvisibility的缺省值是default。
  • -fPIC 要求编译器产生与位置无关代码,也就是代码中不使用绝对地址,而使用相对地址,因此加载器可以将它加载到内存任意位置并执行;

    • 如果不使用-fPIC,产生的代码中包含绝对地址。加载器加载它时,要先重定位,重定位会修改代码段的内容,因此每个进程都生成这个代码段的一份拷贝。
7. 警告选项 Warning Option
选项作用
-Wall允许发出gcc提供的所有有用的报警信息
-Wextra对所有合法但值得怀疑的表达式发出警告
-Werror把告警信息当做错误信息对待
-pedantic允许发出ANSI C标准所列的全部警告信息
8. 调试选项 Debugging Option
选项作用
-g产生带有调试信息的目标代码
-ggdb生成gdb专 用的调试信息,会有一些gdb专用的扩展
-gdwarf-2产生DWARF version2 的格式的调试信息
9. 优化选项 Optimization Option
选项作用
-O0不优化。这是缺省值
-O1尝试优化编译时间和可执行文件大小。
-O2尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。
-O3再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
-O等同与-O1
-Os对生成文件大小进行优化。打开 -O2 开的全部选项,除了会那些增加文件大小的。
-fomit-frame-pointer去掉所有函数SFP(Stack Frame Pointer),即在函数调用时不保存栈帧指针SFP。可以提高程序运行速度, 代价是不能通过backtrace进行调试。
-fno-omit-frame-pointer与-fno-omit-frame-pointer相反
  • -O1打开-fomit-frame-pointer选项
10. 平台相关选项
选项作用
-m32int、long和指针是32位,产生代码在i386系统上运行
-m64int为32位、long和指针是64位,产生代码x86-64架构上运行
-mx32int、long和指针是32位,产生代码x86-64架构上运行