Makefile中常见的gcc编译参数

简介: 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


相关文章
|
4月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
2月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
90 11
|
4月前
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
43 4
|
4月前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
106 0
|
7月前
|
编译器 Linux 开发工具
|
7月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
91 0
006.gcc编译器
|
7月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
|
6月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
|
6月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
204 0
|
7月前
|
C语言
gcc的简易用法
【5月更文挑战第10天】gcc的简易用法。
73 8