-w: 关闭编译时的警告, 也就是编译后不显示任何warning,因此有时编译中会出现一些诸如数据转换之类的可忽略警告,

-Wall: 显示编译后所有警告

-W: 显示警告,但是只是显示编译器认为的会出现错误的警告。

举例说明

对于如下程序

#include <stdio.h>

void main()
{
int a = 10;
return 0;
}

情况1: 直接编译,使用如下命令

gcc -o test test.c

结果只有一个警告

test.c: In function ‘main’:
test.c:7:2: warning: ‘return’ with a value, in function returning void [enabled by default]
return 0;

情况2: 使用-w选项编译,使用如下命令

gcc -w -o test test.c

结果没有任何的警告

情况3: 使用-Wall选项编译,使用如下命令

gcc -Wall -o test test.c

结果显示所有的警告

test.c:3:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
void main()
^
test.c: In function ‘main’:
test.c:7:2: warning: ‘return’ with a value, in function returning void [enabled by default]
return 0;
^
test.c:5:6: warning: unused variable ‘a’ [-Wunused-variable]
int a = 10;
^

情况4: 使用-W选项编译,使用如下命令

gcc -W -o test test.c

只显示了一个编译器认为会出错的警告

test.c: In function ‘main’:
test.c:7:2: warning: ‘return’ with a value, in function returning void [enabled by default]
return 0;

-I的用法

-I选项用于gcc编译器到指定的目录下查找头文件。

以下通过例子进行说明

情况1

例如,当前目录下有main.c add.c add.h三个文件

main.c的内容如下

#include <stdio.h>
#include "add.h" int main()
{
int a = 1;
int b = 2;
int c = add(a, b); printf("%d + %d is: %dn", a, b, c); return 0;
}

add.c的内容如下

int add(int x, int y)
{
return大专栏  gcc编译器常用选项的含义n> x + y;
}

add.h的内容如下

extern int add(int x, int y);

此时,在当前目录使用gcc命令进行编译

gcc -o main main.c add.

生成可执行文件main, 然后执行

./main

运行结果如下,

1 + 2 is: 3

没有任何问题, 此处gcc会在

  • 当前目录

  • /usr/include目录

  • /usr/local/include目录

下查找 add.h 文件,由于add.h文件在当前目录下, 所以一切正常。

情况2

在当前目录下新建一个inc文件夹,然后把add.h移到inc文件夹中,重新编译,会出现如下找不到add.h头文件的问题

wxer-> ls
add.c inc main.c wxer-> gcc -o main main.c add.c
main.c:2:17: fatal error: add.h: No such file or directory
#include "add.h"
^
compilation terminated.

此时要通过-I选项来指定头文件所在目录,通过如下命令进行编译,则没有问题

gcc -Iinc/ -o main main.c add.c

或者

gcc -I inc/ -o main main.c add.c

-fno-builtin与-fno-builtin-function用法

-fno-builtin 用于解决当用户自定义的函数与C语言的内建函数冲突的问题。

当用户自定义的函数与内建函数冲突时,若在gcc的编译选项中加上-fno-builtin时,则表示 不使用C语言的内建函数

对于如下场景,有些函数不想用内建函数,而其他的某些函数还是希望使用内建函数时,那么久需要使用 -fno-builtin-function 选项,其中的function就是冲突的函数名。

-m32与-m64选项用法

-m32:表示生成32位机器汇编代码

-m64:表示生成64位机器汇编代码

-g,-ggdb,-g3与-ggdb3选项用法

-g和-ggdb几乎相同,仅仅有细微的区别。

-g 产生的debug信息是OS native format的(stabs, COFF, XCOFF, or DWARF 2), GDB可以使用之。

-ggdb 产生的debug信息更倾向于给GDB使用的。

所以,如果你用的GDB调试器,那么使用-ggdb选项。如果是其他调试器,则使用-g。

3只是级别。这个级别会产生更多的额外debug信息。3这个级别可以调试宏。

-nostdinc用法

该选项表示编译器不再系统缺省的头文档目录里面找头文档,一般和-I联合使用,明确限定头文档的位置。

-fno-stack-protector用法

该选项表示禁用堆栈保护。

参考

  1. gcc中的-w -W和-Wall选项

  2. GCC编译器中的-I -L -l 选项

  3. What is the difference between gcc -ggdb and gcc -g

  4. GCC 中的编译器堆栈保护技术

  5. gdb debug 信息 stabs 格式

gcc编译器常用选项的含义的更多相关文章

  1. gcc 编译器常用的命令行参数一览

    这些常用的 gcc/g++ 命令行参数,你都知道么? 1. gcc -E source_file.c -E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S, ...

  2. gcc编译常用选项

    我的博客:www.while0.com GDB调试: -g 生成的可执行文件才可以用gdb调试 (建议在发行版中用strip filename 来把这些调试信息去除) 开始调试. 以下是基础调试命令: ...

  3. gcc编译器参数

    [gcc编译步骤] 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] 3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4 ...

  4. GCC编译器和GDB调试器常用选项

    http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello                 ...

  5. GCC编译命令常用选项

    GCC是GUN Compiler Collection的简称,除编译程序外,还包含其他相关工具.GCC可将高级语言编写的源代码构建成计算机直接执行的二进制代码.GCC是Linux平台下最常用的编译程序 ...

  6. gcc/g++ 命令的常用选项

    gcc/g++ 命令的常用选项使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错.假如在程序中用到new delete操作,而不 ...

  7. arm-linux-gcc 常用参数讲解 gcc编译器使用方法

    我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc.下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家.在此之前首先介绍下编译器的工作过程,在使 ...

  8. 第七篇:gcc和arm-linux-gcc常用选项

    目录 一.gcc和arm-linux-gcc的常用选项 二.从.c文件到可执行文件过程 一.gcc和arm-linux-gcc的常用选项 常用选型 -v 查看gcc编译器的版本,显示gcc执行时的详细 ...

  9. GCC 编绎选项 转

    gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:           -Waddress -Warray-bounds (only with -O2) ...

随机推荐

  1. semantic框架 - selection dropdown自定义样式

    semantic和Bootstrap是我最常用的前端框架. 这次需求,是要修改selection dropdown. 直接贴代码,不解释. .ui.form input:not([type]):foc ...

  2. 工作小结:Base64注意事项、标签for属性

    Base64 场景1:后台保存的客户填写备注信息,前台无法正常展示 原因:无法正常展示的备注信息为客户直接从黑屏复制过来的信息,信息中包含有不可见的控制字符,回传至前台的json数据,浏览器无法正常解 ...

  3. list循环 字典循环 字符串常用方法

    list = ['xiaoli','xiaohua','huali']user = {'zhang':'123','lin':'321','chen':'222'}#list循环for stu in ...

  4. postman测试

    Postman接口性能测试 1.从文件中获取参数,然后点击Runner 2.勾选测试用例,配置用例次数.参数文件.返回data等 3.点击run 测试用例 4.查看测试结果 5.测试接口:https: ...

  5. 20199324《Linux内核原理与分析》第十二周作业

    格式化字符串漏洞实验 一. 实验描述 格式化字符串漏洞是由像 printf(user_input) 这样的代码引起的,其中 user_input 是用户输入的数据,具有 Set-UID root 权限 ...

  6. Java之异常的处理(try-catch)

    import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java. ...

  7. MySQL5.7源码安装

    一.获取MySQL5.7.20源码安装包,并上传至服务器   MySQL官网下载地址:https://dev.mysql.com/downloads/mysql/ 下载版本:mysql-boost-5 ...

  8. Thinkphp中js报错,Uncaught SyntaxError: Unexpected token }

    tp中js在行末使用注释报错Uncaught SyntaxError: Unexpected token } if (new_directors==1) {// 注释 解决办法:注释换成单行 if ( ...

  9. oracle时间处理tochar的黑幕坑

    建议改成 在用别人黑不隆东,各种商业套路洗脑下的产品时,能简约弱智就被给自己留坑 做技术没踩过h2这类开源数据库的源码设计,即使砸了一堆时间看了<数据库系统基础教程>,<数据库系统实 ...

  10. Docker系列一: docker简介及基本环境安装

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...