gcc用法小记
By francis_hao Feb 13,2017
概要
这里只列出了最常用的选项
选项解释
-c|-S|-E | 启动gcc编译器时,它会顺序执行预处理、编译、汇编和连接(四个阶段的详细介绍见【参考1】)。这几个选项可以指定gcc停止位置。 -c 程序不执行连接阶段,生成.o目标文件 -S 程序不执行汇编阶段,生成汇编格式.s的文件(编译阶段即将源文件编译成汇编格式文件) -E 程序不执行编译阶段,生成预处理过的源文件 |
-std=standard | 指定语言标准,目前只支持c和c++。 standard可能的取值如下 c89 iso9899:1990 iso9899:199409 c99 c9x iso9899:1999 iso9899:199x gnu89 (This is the default for C code) gnu99 gnu9x 其中-std=c89和-ansi在c语言中等价,-std=c++98和-ansi在c++中等价 |
-g | 产生调试信息,以便GDB调试 |
-pg | 生成额外的程序,用于记录程序运行的相关信息,以便为分析程序gprof使用。gprof见【参考2】。需要注意的是,你必须在编译你想生成运行信息的程序的源文件时使用该选项,同时在连接时也要使用该选项 |
-Olevel | 优化等级,分别有O0、O1、O2、O3和Os五个等级。其中默认的优化等级是O0,推荐的优化等级是O2。更详细的信息见man手册 |
-Wwarn... | -Wall 打开所有的警告 -Werror 将警告以错误来处理 |
-pedantic | 对所有不符合ISO C和ISO C++标准的代码发出警告 |
-Idir... | 将dir添加到搜索头文件的目录列表中,-I指定的目录优先于标准的系统头文件目录。如果dir以"="开始,"="会被sysroot前缀替换掉。see --sysroot and -isysroot |
-llibrary | 连接时搜索library库,需要注意的是,连接时会按照其出现的顺序来进行,需要注意库之间的依赖关系。搜索时实际搜索的名字是liblibrary.a |
-Ldir... | 为-l添加搜索路径 |
-Dmacro[=defn]... | 有两种形式 -Dmacro:等同于#define macro 1 -Dmacro=defn:等同于#define macro defn |
-Umacro | 取消之前的macro的宏定义,不管是程序里的还是-D指定的 |
-mmachine-option... | -f和-m很少用到,-m可能的用法如下: -mcpu=cpu -mtext=text-section -mdata=data-section -mrodata=readonly-data-section |
-o outfile | 将输出文件指定为outfile,outfile可能是可执行文件、汇编文件或与处理过的源文件。如果-o没有被指定,默认输出的可执行文件为a.out,如果源文件为source.suffix,那么默认的目标文件名是source.o,汇编文件名是source.s |
@file | 从文件file中读取选项,文件种的选项以空格分隔。(几乎用不上) |
infile... | 正如其字面意思,输入文件,可以有多个 |
共享库
与动态共享库相关的选项如下
-shared | 产生一个共享的库文件,使用该选项时,为产生可预测的结果,最好在产生代码时指定选项-fpic或-fPIC(在编译源文件到目标文件(.o或.so)时必须指定该选项) |
-fpic | 产生位置独立的代码(Generate position-independent code,PIC),代码通过全局的偏移表(global offset table,GOT)获取固定地址,动态加载器负责解析GOT。如果GOT的大小超过限制,在连接时会出现错误提示,此时需要使用-fPIC 此标志被设置时, 宏 "__pic__" 和 "__PIC__" 定义成1。 |
-fPIC | 类似-fpic,但是没有GOT大小的限制。 此标志被设置时, 宏 "__pic__" 和 "__PIC__" 定义成2 |
其他常用选项
选项 | 含义 |
-print-file-name=library | 打印会在链接时使用的库文件library的全路径 |
-print-search-dirs | 打印gcc安装路径和gcc会搜索库文件的路径 |
本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/6395255.html
参考
【1】Randal E.Bryant David R.O'Hallaron著 龚奕利 雷迎春 译 《深入理解计算机系统》北京:机械工业出版社,2011
【2】CSDN http://blog.csdn.net/stanjiang2010/article/details/5655143 Linux性能评测工具—gprog篇
【3】迟思堂工作室 http://www.latelee.org/programming-under-linux/library-on-linux.html Linux平台静态库、动态库的一些笔记