微信号:code_gg_home

介绍:分享技术干货,分享最新新闻动态,分享开心段子,让大家轻松愉快的成长.

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

2017-12-15 20:57 陆晓明

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


    今日讲解两个命令


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之家 更多文章 搭建安卓系统源代码编译环境 推荐| android公众号,总有你所需要的(内含福利) android am 命令简单讲解(一) android dumpsys 快速入门 android调用dialog.hide()引起的输入事件派发错误问题追踪
猜您喜欢 能不能尊重下别人的版权,不要抄袭? 浅谈NGD之云存储融合VDI、VOI 第一篇 子类初始化父类的二种方法 嵌入式系统知识和接口技术总结