gcc limits.h的bug定位看include_next和默认搜索路径
手编的交叉编译工具链经常报一堆宏未定义,例如下面是编译gtest的时候报_POSIX_PATH_MAX宏未定义,有时还会上报SSIZE_MAX等宏未定义:
googletest/src/gtest-filepath.cc: In static member function ‘static testing::internal::FilePath testing::internal::FilePath::GetCurrentDir()’:
googletest/src/gtest-filepath.cc:61:26: error: ‘_POSIX_PATH_MAX’ was not declared in this scope
# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
^
googletest/src/gtest-filepath.cc:111:12: note: in expansion of macro ‘GTEST_PATH_MAX_’
char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
^
googletest/src/gtest-filepath.cc:112:25: error: ‘cwd’ was not declared in this scope
char* result = getcwd(cwd, sizeof(cwd));
^
经查,SSIZE_MAX和_POSIX_PATH_MAX都定义在include/bits/posix1_lim.h,理论上会有include/limits.h文件会包含,而但实际未生效。下面是gtest-filepath.cc里面的头文件包含定义,可以看出对普通linux而已做47行增加了limits.h的包含。

搜索了一下交叉编译工具链的目录,有7处limits.h的定义,其中/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/include/limits.h和/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/x86_64-linux-gnu/include/limits.h里面还有include_next的用法来二次包含limits.h文件
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/lib/gcc/x86_64-linux-gnu/5.5.0/include-fixed/limits.h
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/lib/gcc/x86_64-linux-gnu/5.5.0/install-tools/include/limits.h
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/include/linux/limits.h
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/include/limits.h
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/x86_64-linux-gnu/include/c++/5.5.0/tr1/limits.h
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/x86_64-linux-gnu/include/linux/limits.h
/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/x86_64-linux-gnu/include/limits.h
下面是/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/include/limits.h和/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/x86_64-linux-gnu/include/limits.h文件里面的摘录,原来123行是没有注释的。

通过在上面这2个头文件里面打点(增加 #error 编译宏)发现上面这2个头文件实际上默认都没用,但如果修改include-fixed目录下面的limits.h文件的名称,编译过程中才会实际引用到include/limits.h,但include_next都二次搜索又会报找不到limits.h的错误。
从这个现象推断,交叉编译工具链优先包含的时候include-fixed下面的头文件,include_next是对头文件搜索路径的二次搜索。
通过注释掉/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/include/limits.h和/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/x86_64-linux-gnu/include/limits.h里面的include_next定义,并在/opt/efb/efb_x86_64_gcc-5.5.0_glibc-2.17_linux/lib/gcc/x86_64-linux-gnu/5.5.0/include-fixed/limits.h中增加include_next定义之后故障解决。
gcc limits.h的bug定位看include_next和默认搜索路径的更多相关文章
- 修改gcc/g++默认include路径
修改gcc/g++默认include路径 转自:http://www.network-theory.co.uk/docs/gccintro/gccintro_23.htmlhttp://ilewen. ...
- C和C++中include 搜索路径的一般形式以及gcc搜索头文件的路径
C和C++中include 搜索路径的一般形式 对于include 搜索的路径: C中可以通过 #include <stdio.h> 和 #include "stidio.h&q ...
- 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录
最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...
- 转载:BUG定位
1.web前端 Web前端就是通常说的网页.互联网公司的前端一般包含如下内容:JavaScript.ActionScript.CSS.HTML(..ML).Flash.交互式设计.视觉设计 web前端 ...
- C 标准库系列之limits.h
limits.h 类似于float.h,其定义了一些列类型的值的范围.限制值,也就是说该类型的值不可以大于该上界或者小于该类型值的下界: glibc中宏定义了一下的值: # define MB_LEN ...
- limits.h头文件
CHAR,SHRT,INT ,LLONG加_MAX后缀表示最大,加_MIN后缀表示最小,加U前缀表示无符号 UCHAR_MIN ,UCHAR_MAX sizeof()计算数所用的空间 #include ...
- <limits.h>和<float.h>
头文件<limits.h>中定义了用于表示整类型大小的常量.以下所列的值是可接受的最小值,实际系统中可能有更大的值. CHAR_BIT char类型的位数 CHAR_MAX UCHAR_M ...
- [转]rpcndr.h和wtypes.h冲突Bug的解决方案
[转]rpcndr.h和wtypes.h冲突Bug的解决方案 http://blog.csdn.net/tzwh_86/article/details/9495133 rpcndr.h和wtypes. ...
- LIMITS.H
/*--------------------------------------------------------------------------LIMITS.H ANSI standard i ...
随机推荐
- 前端笔记:Html页面常用元素
Html页面由基本几个元素(标签)组成 html.head.body.foot(很少使用). html是整个页面的父级元素,内部包括head.body.foot子类标签. head是页头,及页面的头部 ...
- swoole实现任务定时自动化调度详解
开发环境 环境:lnmp下进行试验 问题描述 这几天做银行对帐接口时,踩了一个坑,具体需求大致描述一下. 银行每天凌晨后,会开始准备昨天的交易流水数据,需要我们这边请求拿到. 因为他们给的是一个bas ...
- XCTF 3rd-GCTF-2017 hackme
一.查壳的老生常谈了..2分的题目就不多bb了. 二..elf文件,拖入ida,直接查找字符串,找到对应的函数 三.直接分析: 这里讲道理我当时很懵逼,因为进去这个函数后,发现伪码非常复杂,这里困了挺 ...
- SQL关联子查询
SQL关联子查询执行顺序: 1.先取到主查询中的相关数据,一次取一行主查询的数据 2.然后传入子查询,进行子查询 3.最后做主查询where筛选,注意子查询的where条件同样需要加在主查询后 参考: ...
- LVGL|lvgl中文手册(lvgl中文文档教程)
lvgl官方的教程是英文的,这个是我在做项目时根据lvgl官方文档做出来的lvgl中文文档(持续更新维护),不仅仅只是生硬照搬lvgl官方文档的翻译,同时总结了我们在实际开发中遇到的各种细节,让这个文 ...
- Codeforces Round #139 (Div. 2) 题解
vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...
- c语言字符串存储方式
#include <stdio.h> // C 语言中,任何数据类型都不可以直接存储一个字符串.那么字符串如何存储? //在 C 语言中,字符串有两种存储方式,一种是通过字符数组存储,另一 ...
- java03类与对象相关问题
1.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向他查询"你已经创建了几个对象" 1 package 第四五周; 2 3 public ...
- Java集合中的可变参数
可变参数: 1.在JDK1.5之后,如果我们定义一个方法需要接收多个参数,并且多个参数类型一致,我们可以对其简化成如下格式: 修饰符 返回值类型 方法名(参数类型... 形参名){} 其实这个书写完全 ...
- Spark—编译Spark源码
Spark版本:Spark-2.1.0 Hadoop版本:hadooop-2.6.0-cdh5.7.0 官方文档:http://spark.apache.org/docs/latest/buildin ...