技术拾遗系列 | GCC的系统宏定义查询 以及默认环境变量

分享几个命令,当我们在看一些开源项目,被里面的很多错综复杂的宏包裹,于是想看下这些定义是怎么被定义的,于是用到了一些命令,很是实用,这节整理下来,分享给大家。

今日讲解两个命令

gcc -dM -E - < /dev/null

echo "" | gcc - -E -v

我们知道,GCC版本是非常多,每一版更新出来,都会加入一些新的功能,于是你在编译开源源码的时候,就比较关注这个了。有些开源项目,使用了GCC的新特性,你用旧的GCC有可能会编过,但是在运行时却莫名的出现问题,导致编译出来的东西没法使用。 我们看到开源代码,里面时不时出现这些代码:

这里判断是否定义了__GNUC__ 同时还判断了它的值是否>=某个指定值,然后进行一些设定。 于是我们就需要知道我们当前的GCC到底定义了__GNUC__ 没有,定义的值是多少,于是我们使用如下命令:

gcc -dM -E - < /dev/null

输出的内容为(一部分):

我们从这里看到#define __GNUC__ 4 ,这就可以确定源码中,到底走了哪个条件了。 这个讲解,解决查找系统的一些常量,宏定义,在开源项目里面,因为要兼容很多版本,于是会有很多这种逻辑宏控处理,掌握了这个技巧,能够熟练的查找到编译工具的默认常量宏,帮助自己定位问题。 注意:这里GCC不限定是linux gcc ,arm gcc(ndk开发使用的编译链)也可以使用。 第二个GCC命令,是为了解决如下问题,当我们在处理一个源码的时候,有时引用了一个.h,比如"mem.h",这个头文件,工具查找的思路,先在当前目录查找,没找到,就去系统目录查找,于是乎,就出现一个问题,如果我们是需要引用在另个路径写的,而非系统的那个mem.h,那么我们该如何定位问题呢? 使用:

echo "" | gcc - -E -v

可以看到一堆数据,我们找到我们关注的点(一部分):

出来了一段信息,这里指定了本工具默认的搜索头文件的路径。 于是我们如果发现mem.h要用我们自己项目的文件,而非系统的话,我们可以配置下搜索路径,在编译的时候,加入 -Ipath ,这路path是你自己mem.h的路径,这样子GCC的默认搜索路径就会被修改了,优先找到了你的mem.h

好了,今天就分享这两个命令,关于GCC的更详细的讲解,可以查看官网,或者百度搜索。当网络找不到解决思路的时候,这时,一些辅助命令就会派上用场,比如我们操作的编译命令,可以加入 -v ,用来显示执行过程。

gcc -I/usr/include -o main main.c -v

更多编译那些简单却有用的命令讲解,敬请期待。

本文分享自微信公众号 - 代码GG之家(code_gg_home)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

python2.6升级到3.3.0 的操作记录

线上服务器python版本默认是2.6,由于业务程序要求,需要将python升级到3.3.0 下面对这一升级过程做一记录: Cenots6.8默认安装的是2.6...

39990
来自专栏程序员互动联盟

【答疑解惑】如何避免程序崩溃之一

避免程序崩溃,有很多方法,分别针对不同的崩溃原因,我今天想谈谈一种程序员经常碰到的、不管是初学者甚至编程老手都经常犯的错误,就是程序运行时栈的崩溃。 这种错误相...

38680
来自专栏程序员互动联盟

【专业技术第七讲】linux下如何编译C语言?

存在问题: 小伙伴们都知道gcc -c -o 但是其中的过程和一些参数就不是太清楚了,往往编译出错不知道咋办? 解决方案: 我们来简单普及一下,让大家不盲从请...

38050
来自专栏数据科学与人工智能

Ubuntu 16.04下为TITAN 1080 显卡安装驱动及Gpu版TensorFlow|深度学习

近来入坑了TITAN 1080显卡,在Ubuntu 16.04下为装好驱动以使用Gpu版TensorFlow可不简单,踩了许多坑之后写下此篇为记录。 下载Cu...

502110
来自专栏张善友的专栏

关于gcc、glibc和binutils模块之间的关系

一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“...

31780
来自专栏睿哥杂货铺

动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪

在这篇文章中,我将迅速调研一种跟踪的 Go 程序的新方法:基于 Linux 4.x eBPF 实现动态跟踪。如果你去搜索 Go 和 BPF,你会发现使用 BPF...

74950
来自专栏专注数据中心高性能网络技术研发

HERD--GCC宏

减少跳转语句失效时CPU等待取指令时间,提高CPU效率 使用__builtin_expect(EXP,N) 意思是EXP==N的概率很大 一般封装为LIKELY...

30750
来自专栏大大的微笑

Redis初步了解

①. 到这里下载自己需要的版本 ,http://download.redis.io/releases/,我的版本是2.8.7 ②. 解压下载的安装包到自己想要存...

27160
来自专栏程序员宝库

走进 Redis:Redis 的安装、使用以及集群的搭建

一、Redis的安装 Redis的安装是很简单的,安装之前我们需要c语言的编译环境。如果没有gcc需要在线安装。 yum install gcc-c++。 安装...

365120

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励