gcc tips - GCC使用技巧与高级特性

目录

1. 获取 GCC 编译器预定义的宏

2. 列出依赖的头文件

3. 保存预处理结果到文件(展开define, 展开include header)

4. 写回调跟踪记录函数运行 -finstrument-functions

5. -fdump-rtl-expand 画函数调用关系图


GCC,全称GNU Compiler Collection,是一套功能强大的开源编译器,支持多种编程语言,如C、C++、Fortran、Objective-C、Ada等。GCC的灵活性和可移植性使得它在各种系统和项目中都有广泛的应用。然而,要充分利用GCC的全部潜力,需要熟悉一些高级特性和使用技巧。在本文中,我们将探讨一些GCC的进阶用法,帮助开发者优化代码、提高编译效率并减少潜在错误。

1. 获取 GCC 编译器预定义的宏

  • -E: 只运行预处理器。这意味着编译器将只处理源文件中的预处理器指令(例如 #include#define 等),然后输出预处理后的代码。
  • -dM: 输出所有的宏定义。当与 -E 一起使用时,这将输出编译器预定义的所有宏。
[root]# gcc -E -dM -</dev/null
#define __DBL_MIN_EXP__ (-1021)
#define __FLT32X_MAX_EXP__ 1024
#define __UINT_LEAST16_MAX__ 0xffff
#define __ATOMIC_ACQUIRE 2
#define __FLT128_MAX_10_EXP__ 4932
#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F
#define __GCC_IEC_559_COMPLEX 2
#define __UINT_LEAST8_TYPE__ unsigned char
#define __SIZEOF_FLOAT80__ 16
#define __INTMAX_C(c) c ## L
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 0xff
#define __WINT_MAX__ 0xffffffffU
#define __FLT32_MIN_EXP__ (-125)
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __SIZE_MAX__ 0xffffffffffffffffUL
#define __WCHAR_MAX__ 0x7fffffff
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __DBL_DENORM_MIN__ ((double)4.94065645841246544176568792868221372e-324L)
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_IEC_559 2

2. 列出依赖的头文件

用于生成文件的依赖关系。这个选项对于大型项目特别有用,因为它可以帮助你跟踪哪些头文件被哪个源文件包含,以及当头文件更改时哪些源文件需要重新编译。

当你使用 gcc -M 选项时,GCC 会输出一个规则集,这个规则集描述了源文件和目标文件之间的依赖关系。输出的规则可以直接被 make 工具使用,从而自动化构建过程。

$ gcc -M sizeofstruct.csizeofstruct.o: sizeofstruct.c /usr/include/stdc-predef.h \/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-64.h \/usr/lib/gcc/x86_64-redhat-linux/4.8.5/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/lib/gcc/x86_64-redhat-linux/4.8.5/include/stdarg.h \/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h

3. 保存预处理结果到文件(展开define, 展开include header)

[root]# cat test_e.c
#include<unistd.h>int main(int argc, char** argv){printf("Hello world");return 0;
}# gcc -E test_e.c -o test_e.i[root]# more test_e.i
# 1 "test_e.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "test_e.c"
# 1 "/usr/include/unistd.h" 1 3 4
# 25 "/usr/include/unistd.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 428 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 442 "/usr/include/sys/cdefs.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 443 "/usr/include/sys/cdefs.h" 2 3 4
# 1 "/usr/include/bits/long-double.h" 1 3 4
# 444 "/usr/include/sys/cdefs.h" 2 3 4
# 429 "/usr/include/features.h" 2 3 4
# 452 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4
# 10 "/usr/include/gnu/stubs.h" 3 4
# 1 "/usr/include/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/gnu/stubs.h" 2 3 4
# 453 "/usr/include/features.h" 2 3 4
# 26 "/usr/include/unistd.h" 2 3 4# 202 "/usr/include/unistd.h" 3 4
# 1 "/usr/include/bits/posix_opt.h" 1 3 4
# 203 "/usr/include/unistd.h" 2 3 4# 1 "/usr/include/bits/environments.h" 1 3 4
...[root]# wc test_e.i1416  2357 24475 test_e.i

4. 写回调跟踪记录函数运行 -finstrument-functions

具体见老外写的一篇blog

我们组曾经用此跟踪过一个很棘手的问题。细节先不谈。

5. -fdump-rtl-expand 画函数调用关系图

用于在编译过程中输出 RTL(Register Transfer Language)扩展阶段的中间表示。

当使用这个选项时,GCC 会在编译过程中生成一个包含 RTL 扩展阶段信息的文本文件。这个文件以源文件的扩展名为基础,添加了 .rtl-expand 后缀。例如,如果你正在编译名为 foo.c 的源文件,生成的 RTL 扩展文件将会是 foo.c.rtl-expand

RTL 是 GCC 内部表示的一种中间语言,用于在编译过程中的不同阶段之间传递信息。RTL 扩展阶段是 RTL 转换过程的一部分,其中将高级 RTL 指令转换为更低级别的 RTL 指令,以便后续的机器代码生成阶段。

我曾经用过此编译选项来结合Egypt来画函数调用关系图,直接引用egypt给的一个例子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/267806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利差是什么?anzo Capital昂首资本换个角度学利差

在交易论坛上最常问也是问的最多的一个问题就是“外汇中的利差是多少?”&#xff0c;今天让anzo Capital昂首资本换个角度试着找出答案。 在现代生活中&#xff0c;我们必须为商品和服务付费&#xff0c;包括金融市场上提供的商品和服务。同样的在金融市场中也需要为商品和服…

MYSQL练题笔记-子查询-电影评分

一、题目相关内容 1&#xff09;相关的表 2&#xff09;题目 3&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 1.字典序是指从前到后比较两个字符串大小的方法。 首先比较第1个字符&#xff0c;如果不同则第1个字符较小的字符串更小&…

linux(5):linux基础命令第五弹

在linux基础命令第四弹中http://t.csdnimg.cn/tvuNl我们了解了echo、tail命令、管道符和vim文本编辑器的相关内容。这一篇我们会了解关于命令选项的说明 我们在之前的学习中&#xff0c;发现命令中的选项是非常多的&#xff0c;比如-l -c -m -r -w 等等&#xff0c;命令有很多&…

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示登录成功&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xff0c;弹…

Python3 中常见的数据类型

目录 数字(Number)总结 字符串(String)字符串运算符字符串格式化字符串的截取总结 List&#xff08;列表&#xff09;更新列表删除列表元素列表函数&方法总结 Tuple&#xff08;元组&#xff09;修改元组删除元组总结 Set&#xff08;集合&#xff09;Dictionary&#xff0…

Anaconda安装-超详细版(2023)

Anaconda安装 - 超详细版&#xff08;2023&#xff09; 前言&#xff1a;彻底卸载pythonAnaconda下载地址安装详细步骤配置环境变量检验安装是否成功更改conda源&#xff08;后续安装第三方库可以加快速度&#xff09;超详细彻底卸载Anaconda教程Tensorflow-gpu 安装 前言&…

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤&#xff0c;现在目前大部分开发板都有配置&#xff0c;且也有说明&#xff0c;在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口&#xff0c;以及硬件配置&#xff0c;可以实现对于光纤的收发功能&#xff0c;由于GTX的速率在500Mb…

【NR技术】NR NG-RAN整体架构 -网络接口以及无线协议框架(四)

1 引言 本博文介绍NR NG-RAN的网络节点间的接口以及无线协议框架。网络接口介绍包括RAN和NGC之间的NG接口&#xff1b;无线协议框架包括用户面和控制面协议。 2 NG接口 2.1 NG用户面接口 NG-U (user plane interface)是NG-RAN节点与UPF之间的接口。NG接口的用户平面协议栈如图…

算法Day28 二进制差异序列(格雷码)

二进制差异序列&#xff08;格雷码&#xff09; Description n 位二进制差异序列是一个由2^n个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围[0, 2^n - 1]内&#xff08;含0和2^n - 1&#xff09; 第一个整数是0 一个整数在序列中出现不超过一次 每对相邻整数…

sdxl-turbo:adversarial diffusion distillation

【AIGC第三十一篇】SDXL Turbo&#xff1a;一种实时的文本到图像生成模型 - 知乎【 SDXL Turbo通过采用全新的蒸馏技术&#xff0c;实现了最先进的性能&#xff0c;能够以前所未有的质量进行单步图像生成&#xff0c;将所需的步骤数量从50步减少到仅需一步。这种创新技术大大提…

cache教程 2.单机并发缓存

0.对原教程的一些见解 个人认为原教程中两点知识的引入不够友好。 首先是只读数据结构 ByteView 的引入使用是有点迷茫的&#xff0c;可能不能很好理解为什么需要ByteView。 第二是主体结构 Group的引入也疑惑。其实要是熟悉groupcache&#xff0c;那对结构Group的使用是清晰…

最大公因数,最小公倍数详解

前言 对于初学编程的小伙伴们肯定经常遇见此类问题&#xff0c;而且为之头疼&#xff0c;今天我来给大家分享一下&#xff0c;最大公因数和最小公倍数的求法。让我们开始吧&#xff01; 文章目录 1&#xff0c;最大公因数法1法2法3 2&#xff0c;最小公倍数3&#xff0c;尾声 …