gcc使用备忘
本文为原创文章,转载请指明该文链接
Options Controling the kind of Output
-x language
明确说明输入文件的编码语言,没有该选项的话, gcc 会根据输入文件的后缀来识别其编码语言,某个特定的 -x 选项仅对紧接其后
的且在下个 -x 选项之前的输入文件起作用,现在 -x 支持的语言有: c、c++、objective-c、objective-c++、assember、ada、f77、
java,比如 gcc -S -x c main_return_value.c -x c++ helloworld.cpp ,分别生成 main_return_value.s 和 helloworld.s 文件
-c 把输入文件汇编成二进制目标文件,且不执行链接( link )操作,输入文件可能使 .c 、.i、.s 等格式,输出文件是 .o 格式,比如
gcc -c helloworld.cpp ,生成 helloworld.o
-S 把输入文件编译为汇编代码文件,且不执行汇编( assemble )、链接操作,输入文件可能是 .c、.i 等格式,输出文件是 .s 格式,上边
有例子
-E 根据输入文件生成相应的预处理文件,且不执行编译( complie )、汇编、链接,不指定输出文件名的话,就会把输出打印到屏幕上,
指定输出文件名的话,就生成输出文件,比如:gcc -E helloworld.cpp -o helloworld.ii,就生成 helloworld.ii 文件
-o file
该选项把 gcc 结果输出到文件 file 里,该选项适用于输出可执行文件、输出目标文件(.o)、输出汇编语言文件(.s)、输出预处理文件
(.i)、输出预处理头文件(source.suffix.gch),如果没有指定 -o:对于输出可执行文件就生成 a.out,对于 -c 选项,由 source.suffix
生成 source.o,对于 -S 选项,由 source.suffix 生成 source.s,对于 -E 选项预处理 c 源文件,输出结果生成到屏幕上,例子如上
,对于 -E 选项预处理头文件,由 source.suffix 生成 source.suffix.gch ,对于预处理头文件举例如下:
gcc -E comm/inc/apue.h --> apue.h.gch 执行结果是在 comm/inc/ 目录下生成了 apue.h.gch 文件
-pipe
Use pipes rather than temporary files for communication between the various stages of compilation(预处理、编译、汇编、链接).
This fails to work on some systems where the assembler is unable to read from a pipe; but the GNU assembler has no trouble.
Options controlling c Dialect
-std=
设置编程语言标准,现在仅在编译 c 、c++ 代码时,才支持该选项,例如 -std=c89 -std=c++98
Options for Debugging Your Program or GCC
-g 以操作系统本地格式(stabs, COFF, XCOFF, or DWARF 2)产生调试信息,GDB 使用这些调试信息;GCC 允许 -g 和 -O 一块使用,
但被优化后的代码偶尔产生异常现象:你声明的变量可能就不存在于 -g 的调试信息中;控制流执行到了你认为不该发生的地方;一
些语句没有发生执行,因为它们计算的对象是常量或计算结果已经算出来了
-glevel 同 -g 选项,生成调试信息,且可以指定信息的级别,默认 level 值是 2,
level 0,不产生任何调试信息,因此,-g0 就取消了 -g 选项功能
level 1,produces minimal information, enough for making backtraces in parts of the program that you don’t plan to debug. This
includes descriptions of functions and external variables, but no information about local variables and no line numbers.
level 3,includes extra information, such as all the macro definitions present in the program. Some debuggers support macro
expansion when you use -g3
Options That Control Optimization
并不是所有的优化都存在一个对应的标识,只有存在标识项的优化才可以被-直接优化
-O -O1
执行优化,优化会多耗费一些时间和内存空间;编译器尝试减小代码大小和执行时间,如果编译代码需要大量时间,那么就不会执
行优化
-O2 执行多优化,除了 space-speed 权衡外,gcc 执行所有其他的优化,跟 -O 比,增加了编译时间优化和代码性能优化
-O3 执行更多优化,除了 -O2 优化外,还开启了 -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload,
-ftree-vectorize and -fipa-cp-clone 选项
-O0 减少编译时间,同时保证代码调试功能正常工作,这是默认值
-Os 优化代码大小,-Os 开启 -O2 里的所有不增加代码大小的选项,同时,更深一步执行优化代码大小的设计
Options Controlling the Preprocessor
-D name 定义 name 成为一个宏,且被定义为 1,等于 #define name 1
-D name=definition 定义 name 成为一个宏,且被定义为 definition
-U name 取消之前宏定义 name,不管宏 name 是由代码预处理进来的,还是之前使用 -D 设置的
Options for Linking
-llibrary -l library 执行链接时,查找名字为 liblibrary.a 的库,第二种方式把库名字作为一个分割出来的参数,这是 POSIX 方式
,不推荐使用,我们可以看出来,被查找的库的实际名字——是在 library 前后追加了关键字 lib 和 .a 之后构成的liblibrary.a,
链接器会在系统目录和由 -L 选项指定的目录中查找库 liblibrary.a。链接器按照 .o 文件、库文件出现的顺序来依次链接这些文件
,且这些文件的顺序是很重要的,比如,在序列 foo.o -lz bar.o 中,库 z是在 bar.o 之前加载的,如果 bar.o 中调用了库 z 里函数
,那么在处理 bar.o 时,加载这些函数就会失败。
-lobjc 在链接 Objective-C 、Objective-C++ 程序时使用该选项
-pie 在支持 PIE(position independent executable) 的机器上生成位置无关的可执行程序,如果使用该选项,那么必须搭配使用代
码生成选项,比如 -fpie、-fPIE等模型子选项
-rdynamic 在支持该选项的机器上,把标识 -export_dynamic 传递给 ELF 连接器,该选项指导连接器把所有符号(包括已使用到的
符号)添加到动态符号表中;当代码调用了 dlopen 这类接口或欲在程序内部获得 backtrances 功能时,需要使用该选项。
-static 在支持动态链接的系统上,该选项可以防止链接共享库,在不支持动态链接的系统上,该选项不起作用
-shared 产成一个共享对象(比如共享库对象),在编译链接其他可执行程序时链接这样的共享对象。在支持该选项的系统上使用该
选项时,同时必须搭配使用代码生成选项,比如 -fpie、-fPIE等模型子选项
Options for Directory Search
-Idir 把目录 dir 添加到头文件搜索目录链表中,如果多次使用 -I 选项,那么这些目录是按照从左至右的顺序依次搜索的,且目录
dir 是在系统头文件目录之前被搜索的;如果 -I 选项设置的目录是系统头文件目录或者是已由 -isystem 设置过的目录,那么
这个 -I 选项将无效,但这些目录仍将在头文件目录链中被搜索
-iquotedir 对于 #include "file",该选项把 dir 添加到了头文件搜索目录链的头部,成为第一个被搜索的目录,但对于
#include <file>,连接器将不会搜索该目录
-Ldir 为 -l 选项添加库文件的搜索目录
-I- 该选项被建议不再使用
Options for Code Generation Conventions
该类选项的大部分都存在有效、无效两种形式,比如 -ffoo 是有效形式,-fno-foo 是无效形式,下面介绍的仅是该类选项的非默认形
式,可以通过添加或移除 no- 来构造该类选项的默认形式
-fpic 在支持该功能的机器上,为共享库生成位置无关代码 PIC(position-independent cod),PIC 可以通过 GOT(global offset table)
访问所有 constant 内存地址;可执行程序启动时,动态加载器会解析 GOT 的入口表项,如果可执行程序 GOT 的大小超过了目标
机器的相关参数的最大值,连接器会发出错误信息以提示 -fpic 没有正常工作,我们需要使用 -fPIC 替代 -fpic 重新编译链接,该选
项会使宏 "__pic__"、"__PIC__" 被定义为 1
-fPIC 在支持 PIC 的机器上,生成适用于动态链接的 PIC 代码,且该选项避免了 GOT(global offset table) 的大小限制
该选项会使宏 "__pic__"、"__PIC__" 被定义为 2
-fpie -fPIE
这两个选项的功能与 -fpic 、-fPIC 类似,但是由这两个选项生成的 PIC 代码只可以被链接到可执行程序里,
在执行链接时,当 -pie 选项被使用时,要使用这两个选项里其中的一个, -fpie 使宏“__pie__”、“__PIE__” 定义为 1,-fPIE 使宏
“__pie__”、“__PIE__” 定义为 2
到此请歇息,关于 GCC 详细信息还得需要 man gcc
gcc使用备忘的更多相关文章
- Linux常用命令速查备忘
Linux常用命令速查备忘 PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown ...
- 代码备忘, TODO宏实现
代码备忘, TODO宏实现 我们平时在开发过程中, 往往并非憋足气一股脑敲完所有代码.每一个模块, 每一个函数的实现总有个先后顺序. 又或者哪个部分须要做调整, 改动- 所以, 我们须要有一个东西, ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
随机推荐
- [转]SVN安装问题The Apache Portable Runtime (APR) library cannot be found
http://blog.csdn.net/ckwer2008/article/details/47972601 Linux很多地方编译的时候都会用到apr 如果找不到apr就会报错 configure ...
- 数组中的push()和pop()方法
push()方法可以接受任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度. pop()方法是从数组末尾移除最后一项,减小数组的length值,然后返回移除的项. var arr = [ ...
- shell产生随机数七种方法
shell实例浅谈之三产生随机数七种方法 一.问题 Shell下有时需要使用随机数,在此总结产生随机数的方法.计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数).伪随机数在大 ...
- 安装完office2016 64位后,在安装visio时,报错,无法安装,
安装环境要求: 系统要求:win8,win10等: office要求:sw(批量版)不能和cn(零售版).365版混装.-------重点注意事项 一定要注意批量版和零售版的区别,各版本之间绝对不允许 ...
- C#之Raw Socket网络封包监视源码
大家可以建立一个Windows Form应用程序,在下面的各个文件中添加对应的源码: //RawSocket.csnamespace ReceiveAll{ using System; using S ...
- 如何在不重启或重新格式化hadoop集群的情况下删除集群节点
在master节点上的hadoop安装目录下 进入conf目录 配置hdfs-site.xml文件 添加节点如下: <property> <name>dfs.hosts.exc ...
- Centos 7 进入单用户模式图文详解
由于昨晚做了一个很傻X的事情,所以有幸进入了CentOS 7 的单用户模式. CentOS 7 在进入单用户的时候和6.x做了很多的改变, 下面让我们来看看如何进入单用户模式. 如何进入CentOS ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何设置PLC的扫描周期,运行周期
双击PlcTask,然后再Cycle ticks中可以修改PLC的扫描周期,例如修改为2ms 为了验证是否真的是2ms,可以在程序中跟计数器绑定使用,PLC2ms扫描一次,计数器也是每个周期增加0 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何自动运行,不让用户干涉,设置起始界面
右击视图管理器,添加一个TargetVisualization 在起始视图中点击右边的按钮,然后选择一个HMI作为起始HMI 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: h ...
- C、C++文件操作大全
基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio ...