主要学习如下gcc选项:

-C、-M、-MM、-MD、-MMD、编译优化选项(-O0、-O1、-O2、-O3)、-Wall

8、-C 选项

在预处理的时候,不删除注释信息,一般和-E一起使用。有时候分析程序,比较方便。

比如,加上注释的这段程序HelloWorld.c程序如下:

#include <stdio.h>

int main()
{
       
    printf("Hello,the world!\n");
    return 0;
}

如果只是使用-E选项进行编译:

[root@shirdrn junys]# gcc -E HelloWorld.c > HelloWorld.c.ignorecomments.txt

则会忽略注释,从而加快预处理过程,导出生成的HelloWorld.c.ignorecomments.txt文件就比使用-C和-E一起进行编译生成的导出文件大很多:

[root@shirdrn junys]# gcc -C -E HelloWorld.c > HelloWorld.c.txt

HelloWorld.c.txt文件为2582行,HelloWorld.c.ignorecomments.txt文件为934行。

9、 -M 选项

生成当前编译程序文件关联的详细信息,包含目标文件所依赖的所有源代码文件,包括头文件。

比如,使用-M选项进行编译:

[root@shirdrn junys]# gcc -M HelloWorld.c

生成的关联文件的信息如下所示:

HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h

10、-MM 选项

同-M选项一样,不同的是,它将忽略由#include 包含的头文件所造成的文件之间的依赖关系。

比如,使用-MM选项进行编译:

[root@shirdrn junys]# gcc -MM HelloWorld.c

只要与#include <stdio.h>中有关联的文件信息都不会显示出来,如下所示:

[root@shirdrn junys]# gcc -MM HelloWorld.c
HelloWorld.o: HelloWorld.c
[root@shirdrn junys]#

11、-MD 选项

同-M选项相同,生成当前编译程序文件关联的详细信息,包含目标文件所依赖的所有源代码文件,包括头文件,但是,信息输出将导入到.d的文件里面。

比如使用-MD选项进行编译:

[root@shirdrn junys]# gcc -MD HelloWorld.c

编译结果是,生成一个HelloWorld.d文件,该文件包含了于程序文件关联的文件的信息,HelloWorld.d文件内容如下所示:

HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h

12、-MMD 选项

同-MM选项相同,将忽略由#include 包含的头文件所造成的文件之间的依赖关系,但是,信息输出将导入到.d的文件里面。

比如使用-MMD选项进行编译:

[root@shirdrn junys]# gcc -MD HelloWorld.c

编译结果是,生成一个HelloWorld.d文件,该文件包含了于程序文件关联的文件的信息,HelloWorld.d文件内容如下所示:   

HelloWorld.o: HelloWorld.c

13、优化选项

编译器优化主要有下面四个选项:

-O0
-O1
-O2
-O3

-O0选项表示没有优化;-O1选项为缺省值;-O3选项表示优化级别最高。

但是,需要明确一点,优化级别越高,编译的速度会越慢的。

使用比这段程序HelloWorld.c程序如下:

#include <stdio.h>

int main()
{
       
    printf("Hello,the world!\n");
    return 0;
}

通过使用O0和O3级别的优化选项进行一下对比吧。

使用O0优化级别进行编译,如下所示:

[root@shirdrn junys]# time gcc -o O0HelloWorld -O0 HelloWorld.c

real    0m1.003s
user    0m0.142s
sys     0m0.061s

使用O3优化级别进行编译,如下所示:

[root@shirdrn junys]# time gcc -o O3HelloWorld -O3 HelloWorld.c

real    0m1.067s
user    0m0.142s
sys     0m0.053s

优化级别越高,运行程序的效率是越高的,可以通过使用上面的两个级别编译的程序,进行一下运行效率的对比,如下所示:

[root@shirdrn junys]# time ./O0HelloWorld
Hello,the world!

real    0m0.014s
user    0m0.000s
sys     0m0.002s

[root@shirdrn junys]# time ./O3HelloWorld
Hello,the world!

real    0m0.003s
user    0m0.000s
sys     0m0.003s

由于HelloWorld.c这个程序过于简单了,所以测试比较不是很明显,你可以尝试使用一个更加复杂的程序进行测试一下。

14、-Wall 选项

用于输出警告信息。

例如,这段程序HelloWorld.c,没有返回语句return 0;,程序如下:

#include <stdio.h>

int main()
{  
    printf("Hello,the world!\n");
}

正常情况下进行编译,没有任何错误信息,编译通过,但是如果指定了-Wall选项进行编译,会输出警告信息:

[root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c
HelloWorld.c: 在函数 ‘main’ 中:
HelloWorld.c:8: 警告:在有返回值的函数中,控制流程到达函数尾

再比如,在程序中定义了变量但是没有使用到:

#include <stdio.h>

int main()
{  
    int cnt = 100;
    printf("Hello,the world!\n");
}

也会提示警告信息:

[root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c
HelloWorld.c: 在函数 ‘main’ 中:
HelloWorld.c:6: 警告:未使用的变量 ‘cnt’
HelloWorld.c:9: 警告:在有返回值的函数中,控制流程到达函数尾

gcc学习与实践(2)相关推荐

  1. 八大深度学习最佳实践

    翻译 | AI科技大本营 参与 | 刘畅 [AI 科技大本营导读] 2017年,许多的人工智能算法得到了实践和应用.名博Hack Noon作者 Brian Muhia 认为想要玩转人工智能,不仅要拥有 ...

  2. 深度学习算法实践(基于Theano和TensorFlow)

    深度学习算法实践(基于Theano和TensorFlow) 闫涛 周琦 著 ISBN:9787121337932 包装:平装 开本:16开 用纸:胶版纸 正文语种:中文 出版社:电子工业出版社 出版时 ...

  3. 【PWA学习与实践】(3) 让你的WebApp离线可用

    <PWA学习与实践>系列文章已整理至gitbook - PWA学习手册,文字内容已同步至learning-pwa-ebook.转载请注明作者与出处. 本文是<PWA学习与实践> ...

  4. Google App Engine 学习和实践

    这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧.不当之处,请多多指正. 作者:liigo,2009/04/26夜,大连 原创链接:http://blog.csdn.ne ...

  5. 人工神经网络理论、设计及应用_TensorFlow深度学习应用实践:教你如何掌握深度学习模型及应用...

    前言 通过TensorFlow图像处理,全面掌握深度学习模型及应用. 全面深入讲解反馈神经网络和卷积神经网络理论体系. 结合深度学习实际案例的实现,掌握TensorFlow程序设计方法和技巧. 着重深 ...

  6. 深度学习笔记第二门课 改善深层神经网络 第一周:深度学习的实践层面

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  7. .NET Core 微服务学习与实践系列文章目录索引(2019版)

    Photo :.NET Core 文 | Edison Zhou 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各种开源组件搭建服务治理技术方案,并在学习过程中总结了一 ...

  8. .NET Core on K8S 学习与实践系列文章索引 (更新至20191126)

    更新记录: -- 2019-11-26 增加Docker容器日志系列文章 近期在学习Kubernetes,基于之前做笔记的习惯,已经写了一部分文章,因此给自己立一个flag:完成这个<.NET ...

  9. .NET Core on K8S 学习与实践系列文章索引 (更新至20191116)

    更新记录: -- 2019-11-16 增加Docker容器监控系列文章 // 此外,今天是11月17日,我又老了一岁,祝我自己生日快乐! 近期在学习Kubernetes,基于之前做笔记的习惯,已经写 ...

最新文章

  1. excel小写转大写公式_【Excel函数贴】五个技巧性函数小套路
  2. SAP MM ML81N为采购订单创建服务接收单,报错- No matching PO items selected -
  3. 5G NGC — 云原生的 5G 核心网架构演进
  4. SQLite 附加数据库(http://www.w3cschool.cc/sqlite/sqlite-attach-database.html)
  5. Spring 事务core 模块-RowMapper
  6. 面试官:Spring为什么建议使用构造器来注入?
  7. springboot项目集成Flowable资料汇总
  8. 自定义的网页加密与解密
  9. 红罐王老吉品牌定位战略制定过程详解
  10. 出现( linker command failed with exit code 1)错误总结
  11. 中兴ZXD2400电源电路图图纸 图纸 线路图不是PCB图
  12. 分享ASP.NET视频系列教程——第十九讲 ASP.NET内置的AJAX
  13. HDU - 3966(树链剖分)
  14. java保龄球计分_TDD练习:保龄球计分
  15. 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:
  16. 移动硬盘数据恢复需多少钱?关于这个不伤钱的方法
  17. 数据库系统原理-课程目标
  18. 制作TEC数据集的步骤
  19. NL-meals、BM3D
  20. JavaScript 案例:房贷计算器

热门文章

  1. Mysql 数据库锁机制浅析
  2. 由canvas实现btn效果有感
  3. Configure VNC in RHEL 7
  4. 从字节码层面,解析 Java 布尔型的实现原理
  5. 一台linux服务器配置多个tomcat应用
  6. input 下面的span 标签 作为下拉框选项的点击
  7. idea阅读器插件开发实现
  8. Eva.js 渲染Web页面动画
  9. G2 可视化引擎-统计图表
  10. C++ 资源大全整理