手编的交叉编译工具链经常报一堆宏未定义,例如下面是编译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和默认搜索路径的更多相关文章

  1. 修改gcc/g++默认include路径

    修改gcc/g++默认include路径 转自:http://www.network-theory.co.uk/docs/gccintro/gccintro_23.htmlhttp://ilewen. ...

  2. C和C++中include 搜索路径的一般形式以及gcc搜索头文件的路径

    C和C++中include 搜索路径的一般形式 对于include 搜索的路径: C中可以通过 #include <stdio.h> 和 #include "stidio.h&q ...

  3. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...

  4. 转载:BUG定位

    1.web前端 Web前端就是通常说的网页.互联网公司的前端一般包含如下内容:JavaScript.ActionScript.CSS.HTML(..ML).Flash.交互式设计.视觉设计 web前端 ...

  5. C 标准库系列之limits.h

    limits.h 类似于float.h,其定义了一些列类型的值的范围.限制值,也就是说该类型的值不可以大于该上界或者小于该类型值的下界: glibc中宏定义了一下的值: # define MB_LEN ...

  6. limits.h头文件

    CHAR,SHRT,INT ,LLONG加_MAX后缀表示最大,加_MIN后缀表示最小,加U前缀表示无符号 UCHAR_MIN ,UCHAR_MAX sizeof()计算数所用的空间 #include ...

  7. <limits.h>和<float.h>

    头文件<limits.h>中定义了用于表示整类型大小的常量.以下所列的值是可接受的最小值,实际系统中可能有更大的值. CHAR_BIT char类型的位数 CHAR_MAX UCHAR_M ...

  8. [转]rpcndr.h和wtypes.h冲突Bug的解决方案

    [转]rpcndr.h和wtypes.h冲突Bug的解决方案 http://blog.csdn.net/tzwh_86/article/details/9495133 rpcndr.h和wtypes. ...

  9. LIMITS.H

    /*--------------------------------------------------------------------------LIMITS.H ANSI standard i ...

随机推荐

  1. spring boot j集成seagger 加入拦截器后 swagger 不能访问

    一开始我是这样排除拦截的,但是发现没用 后来我发现swagger的真实访问路径是这样的 转自: https://blog.csdn.net/ab1991823/article/details/7906 ...

  2. linux安装subversion

    原文: https://www.cnblogs.com/liuxianan/p/linux_install_svn_server.html 安装 使用yum安装非常简单: yum install su ...

  3. CG-CTF Our 16bit Games

    一.放到xp上面跑,发现是一个图形界面的飞机游戏...估计是分数到达多少,然后就可以输出flag. 打开ida,一脸懵逼,主要这玩意16位,我直接静态调试了 发现很多汇编代码,有点懵逼,在最下方的地方 ...

  4. python使用笔记28--unittest单元测试框架

    单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 unittest框架,执行的顺序是按照方法名的字母来排序的 setUpClass方法是最开始执行的 tearDo ...

  5. 基于Ryu的流量采集代码实现

    1 from __future__ import division 2 import time 3 import math 4 import xlwt 5 from ryu.controller im ...

  6. File类与常用IO流第十一章——打印流

    第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...

  7. R绘图(7): 把散点图的点换成扇形

    前几天分析了一批单细胞TCR的数据,需要画这样一个图: 行是不同的样本,列是不同的T细胞类型,每一个位置点的大小表示T细胞的数目多少,并且还需要根据T细胞所属的克隆型类型涂色.这个图用来描述TCR是我 ...

  8. 记一次错误:mid=front+(rear-front)>>1;

    设rear=6,front=4,mid=front+(rear-front)>>1; mid应该等于5的,但结果却是3. 错误原因:"+"运算符的优先级高于" ...

  9. [考试总结]noip模拟14

    咕掉了好长时间,现在终于回来了.. 这次考试炸裂得很完蛋,直接分数上天. \(T1\) 本来想打一个记忆化搜索,然而老是通过不了样例,然后就挂了,只剩下了垃圾的 \(30pts\) 部分分数. 然而到 ...

  10. odoo14学习----x2many操作与图片设置继承image.mixin

    三种方式实现数据更新 一,如上所述 二,通过对数据集调用update({'key':value,'key1':value1..})更新数据集 三,调用write函数,与update类似,传递字典.   ...