一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2369|回复: 0
收起左侧

gcc编译器 CFLAGS 标志参数说明

[复制链接]
发表于 2017-1-12 19:59 | 显示全部楼层 |阅读模式
CFLAGS = -g -O2  -Wall -Werror -Wno-unused& N( Q/ Z# T: F. y' z

( s1 X/ r% o  g% N$ U编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法:  s. d3 Q: E5 o  ~( h
增加CFLAGS 或CPPFLAGS参数如下:
. R8 W% q) T5 g" C6 g+ j7 f6 z. t  CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 18 U" [- N8 t( Q( [/ k5 Q

8 c+ j" H" ^# J) N& O$ a) j% z8 D

                                          Gcc总体选项列表

后 缀 名

所对应的语言

-S

只是编译不汇编,生成汇编代码

-E

只进行预编译,不做其他处理

-g

在可执行程序中包含标准调试信息

-o file

把输出文件输出到file里

-v

打印出编译器内部编译各过程的命令行信息和编译器的版本

-I dir

在头文件的搜索路径列表中添加dir目录

-L dir

在库文件的搜索路径列表中添加dir目录

-static

链接静态库

-llibrary

连接名为library的库文件

- M* B* T' t4 \  V5 D" {4 M

· “-I dir”

正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。

比如在“/root/workplace/Gcc”下有两个文件:

#include

int main()

{

     printf(“Hello!!\n”);

     return 0;

}

#include

这样,就可在Gcc命令行中加入“-I”选项:

[root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1

这样,Gcc就能够执行出正确结果。

小知识

在include语句中,“<>”表示在标准路径中搜索头文件,““””表示在本目录中搜索。故在上例中,可把hello1.c的“#include”改为“#include “my.h””,就不需要加上“-I”选项了。

· “-L dir”

选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库libsunq.so,则只需键入如下命令即可:

[root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq

需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。

另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接名为libsunq.so的文件。

(2)告警和出错选项

Gcc的告警和出错选项如表3.8所示。

                                                        Gcc总体选项列表

选 项

含 义

-ansi支持符合ANSI标准的C程序
-pedantic允许发出ANSI C标准所列的全部警告信息
-pedantic-error允许发出ANSI C标准所列的全部错误信息
-w关闭所有告警
-Wall允许发出Gcc提供的所有有用的报警信息
-werror把所有的告警信息转化为错误信息,并在告警发生时终止编译过程

2 o6 }! r3 k- c

下面结合实例对这几个告警和出错选项进行简单的讲解。

如有以下程序段:

#include

void main()

{

     long long tmp = 1;

     printf(“This is a bad code!\n”);

     return 0;

}

这是一个很糟糕的程序,读者可以考虑一下有哪些问题?

· “-ansi”

该选项强制Gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。运行结果如下所示:

[root@localhost Gcc]# Gcc –ansi warning.c –o warning

warning.c: 在函数“main”中:

warning.c:7 警告:在无返回值的函数中,“return”带返回值

warning.c:4 警告:“main”的返回类型不是“int”

可以看出,该选项并没有发现”long long”这个无效数据类型的错误。

· “-pedantic”

允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。其运行结果如下所示:

[root@localhost Gcc]# Gcc –pedantic warning.c –o warning

warning.c: 在函数“main”中:

warning.c:5 警告:ISO C90不支持“long long”

warning.c:7 警告:在无返回值的函数中,“return”带返回值

warning.c:4 警告:“main”的返回类型不是“int”

可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。

· “-Wall”

允许发出Gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示:

[root@localhost Gcc]# Gcc –Wall warning.c –o warning

warning.c:4 警告:“main”的返回类型不是“int”

warning.c: 在函数”main”中:

warning.c:7 警告:在无返回值的函数中,”return”带返回值

warning.c:5 警告:未使用的变量“tmp”

使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。

另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。

(3)优化选项

Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的Gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。

不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。

虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。

(4)体系结构相关选项

Gcc的体系结构相关选项如表3.9所示。

                                                    Gcc体系结构相关选项列表

选 项

含 义

-mcpu=type针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等
-mieee-fp使用IEEE标准进行浮点数的比较
-mno-ieee-fp不使用IEEE标准进行浮点数的比较
-msoft-float输出包含浮点库调用的目标代码
-mshort把int类型作为16位处理,相当于short int
-mrtd

强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令

. S5 T& p3 D+ V8 T- c" t
- A9 M( W" b5 _5 o( Z
原创:[url]http://blog.chinaunix.net/uid-20672257-id-3408132.html[/url]; A; \2 V# k) L+ \# V' K; R

9 h3 u2 _; n4 X6 E* {: D
1 n3 k9 Q! T% r! ^0 Y: @' d( H- D7 _- v0 v$ q- y

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-2 17:43 , Processed in 0.067973 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表