Makefile中常见的gcc编译参数

前言

  在修改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

猜你喜欢

转载自blog.csdn.net/qq_42330920/article/details/127496376