前言
在修改Makefile时为了方便清楚地知道在编译时都做了哪些操作,补充下gcc编译中常见的一些参数
后缀名
首先补充下编译过程中各个后缀文件的含义
.c C源程序;预处理,编译,汇编
.C C++源程序;预处理,编译,汇编
.cc C++源程序;预处理,编译,汇编
.cxx C++源程序;预处理,编译,汇编
.m Objective-C源程序;预处理,编译,汇编
.i 预处理后的C文件;编译,汇编
.ii 预处理后的C++文件;编译,汇编
.s 汇编语言源程序;汇编
.S 汇编语言源程序;预处理,汇编
.o 目标文件(Object file)
.a 归档库文件(Archive file)
总体选项
选项必须分立给出: ‘-dr’完全不同于‘-d -r ’.
大多数‘-f’和`-W’选项有两个相反的格式:
-c
编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.
缺省情况下, GCC通过用‘.o’替换源文件名后缀‘.c’, ‘.i’, `.s’,等等,产生目标文件名.可以使用-o选项选择其他名字.
GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).
-S
编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.
缺省情况下, GCC通过用‘.o’替换源文件名后缀‘.c’, `.i’,等等,产生 目标文件名.可以使用-o选项选择其他名字.
GCC忽略任何不需要编译的输入文件.
-E
预处理后即停止,不进行编译.预处理后的代码送往标准输出.
GCC忽略任何不需要预处理的输入文件.
-o file
指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是 预处理后的C代码.
由于只能指定一个输出文件,因此编译多个输入文件时,使用’o’选项没有意义,除非输出一个可执行文件.
如果没有使用‘-o’选项,默认的输出结果是:可执行文件为‘a.out’, ‘source.suffix ’的目标文件是‘source.o’,汇编文件是 `source.s’,而预处理后的C源代码送往标准输出.
-v
(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.
-pipe
在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的 汇编器不能从管道读取数据. GNU的汇编器没有这个问题.
目录选项(DIRECTORY OPTION)
下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:
-Idir
在头文件的搜索路径列表中添加dir 目录.
-I-
任何在‘-I-’前面用‘-I’选项指定的搜索路径只适用于‘#include “file”’这种情况;他们不能用来搜索‘#include ’包含的头文件.
如果用‘-I’选项指定的搜索路径位于‘-I-’选项后面,就可以在这些路径中搜索所有的 ‘#include’指令. (一般说来-I选项就是这么用的.)
还 有, ‘-I-’选项能够阻止当前目录(存放当前输入文件的地方)成为搜索‘#include “file”’的第一选择.没有办法克服`-I-’选项的这个效应.你可以指定 ‘-I.’搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常 令人满意.
‘-I-’不影响使用系统标准目录,因此, ‘-I-’和`-nostdinc’是不同的选项.
-Ldir
在`-l’选项的搜索路径列表中添加dir目录.
-Bprefix
这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.
编译器驱动程序需要执行某些下面的子程序: ‘cpp’, ‘cc1’ (或C++的 ‘cc1plus’), ‘as’和‘ld’.他把prefix当作欲执行的程序的 前缀,既可以包括也可以不包括‘machine/version/’.
对 于要运行的子程序,编译器驱动程序首先试着加上‘-B’前缀(如果存在).如果没有找到文件,或没有指定 ‘-B’选项,编译器接着会试验两个标准前缀‘/usr/lib/gcc/’和 ‘/usr/local/lib/gcc-lib/’.如果仍然没能够找到所需文件,编译器就在‘PATH’环境变量 指定的路径中寻找没加任何前缀的文件名.
如果有需要,运行时(run-time)支持文件‘libgcc.a’也在‘-B’前缀的搜索 范围之内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数 情况的多数机器上, ‘libgcc.a’并非必不可少.
可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的 一样用做前缀.如果同时指定了‘-B’选项和GCC_EXEC_PREFIX变量,编译器首先使用 `-B’选项,然后才尝试环境变量值.
Bsymbolic
表示强制采用本地的全局变量定义,这样就不会出现动态链接库的全局变量定义被应用程序/动态链接库中的同名定义给覆盖了!
-Dxxxxxx
定义宏xxxxxx,宏的内容定义为字符串`1’.
-fhosted
按宿主环境编译;他隐含声明了`-fbuiltin’选项,而且警告不正确的main函数声明.
-fPIC
全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转。相对详细的例子和解释参考下面博文
https://blog.csdn.net/itworld123/article/details/117587091
for-scope
则限制变量作用自声明点至包含for语句的域。
-fno-const-strings
强制g++把字符串常量的类型定义成char *,而无论ISO C++标准是否要求是const char *
http://www.javashuo.com/article/p-fjuflmvx-es.html
-shared:
表明产生共享库
.SUFFIXES
https://blog.csdn.net/qq_21438461/article/details/125588294
-soname
指定so的别名,很有用。如果不知道别名,链接了该so的文件中会包含路径。
-Wall
结合所有上述的’-W’选项.通常我们建议避免这些被警告的用法,我们相信,恰当结合宏的使用能够 轻易避免这些用法。
剩下的’-W…'选项不包括在`-Wall’中,因为我们认为在必要情况下,这些被编译器警告 的程序结构,可以合理的用在"干净的"程序中.
https://blog.51cto.com/u_847102/5272400