Linux GCC 编译选项
一般选项(Overall Option)
-v
打印命令到stderr,-v 会打印编译过程的详细信息,如完全的编译选项(包括gcc内部添加的编译选项),如头文件目录的搜索顺序等。
-E
要求gcc仅作预处理,不进行编译、汇编和链接。
-c
编译、汇编到目标代码,不进行链接。
-o
输出到指定文件。如果没有指定,则输出到a.out。
语言选项(Language Option)
-std=
编译时遵循的语言标准,目前支持C/C++,如c99, c++0x等(-std=c++11)。
Linux gcc编译之-std选项 - 寒魔影 - 博客园 (cnblogs.com)
目录选项(Directory Option)
-ldir
把dir加入到搜索头文件的路径列表中。
-Ldir
把dir加入到搜索库文件的路径列表中。
预编译选项(Preprocessor Option)
-Dname=definition
定义预编译宏,名字name,值definition。
-Dname
定义预编译宏,名字name,值为1。
-M
告诉预处理器输出一个make rule,描述源代码文件依赖哪些文件。
链接选项(Linker Option)
-lx
进行链接时搜索名为libx.so的库
-shared
生成动态库
-static
生成静态库
-rdynamic
链接器将所有符号添加到动态符号表中,方便dlopen()等使用。
-rdynmaic 传递 -export-dynamic 给链接器,连接器将把所有的符号加入动态符号表(dynamic symbol table)
这是调试dlopen()加载的模块时需要的,不指定则连接器会删除不使用的符号。
-s
去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。
代码生成选项(Code Generation Option)
-fPIC
编译动态库时,要求产生与位置无关代码(Position-Independent Code)
-fPIC 要求编译器产生与位置无关代码,也就是代码中不使用绝对地址,而使用相对地址,因此加载器可以将它加载到内存任意位置并执行;
如果不使用-fPIC,产生的代码中包含绝对地址。加载器加载它时,要先重定位,重定位会修改代码段的内容,因此每个进程都生成这个代码段的一份拷贝。
-fvisibility=default | hidden
默认情况下,设置ELF镜像中符号的可见性为public或hidden
-fvisibility=hidden 可以显著地提高链接和加载共享库的性能,生成更加优化的代码,
提供近乎完美的API输出和防止符号碰撞。强烈建议在编译共享库的时候使用它。(对静态库没有效果)
警告选项(Warning Option)
-Wall
允许发出gcc提供的所有有用的报警信息
-Wextra
对所有合法但值得怀疑的表达式发出警告
-Werror
把告警信息当做错误信息对待
-pedantic
允许发出ANSI C标准所列的全部警告信息
调试选项(Debugging Option)
-g
产生带有调试信息的目标代码
-ggdb
生成gdb专 用的调试信息,会有一些gdb专用的扩展
-gdwarf-2
产生DWARF version2 的格式的调试信息
-g3
gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。
编译时添加-gdwarf-2和-g3这两个参数就可以调试宏定义
优化选项(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相反
平台相关选项
-m32
int、long和指针是32位,产生代码在i386系统上运行
-m64
int为32位、long和指针是64位,产生代码x86-64架构上运行
-mx32
int、long和指针是32位,产生代码x86-64架构上运行