首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术拾遗系列 | GCC的系统宏定义查询 以及默认环境变量

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

作者头像
用户1263308
发布2018-02-02 11:25:51
1.5K0
发布2018-02-02 11:25:51
举报
文章被收录于专栏:代码GG之家代码GG之家

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

今日讲解两个命令

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码GG之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档