• 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

  • 相关阅读:
    SV--类型转换
    自建zerotier服务——实现更快速安全的远程连接
    带你刷(牛客网)C语言百题(第三天)
    Redis过期删除策略和内存淘汰策略
    4.Layui四个表单元素
    45 万用户受影响,Mozilla封杀Firefox恶意组件
    JS面试题汇总(Es6)
    DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)
    大数据之LibrA数据库常见术语(一)
    开发企业微信群机器人,实现定时提醒
  • 原文地址:https://blog.csdn.net/qq_42330920/article/details/127496376