手编的交叉编译工具链经常报一堆宏未定义,例如下面是编译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. MySQL 插入中文后,显示为空白

    https://blog.csdn.net/sun_hj_95/article/details/79488583 在MySQL中插入中文后,显示如下: 解决方案: 在my.ini (在MySQL的安装 ...

  2. JavaWeb中Servlet和Jsp跳转路径的写法

    最近学习时,常常要写一些页面之间的跳转或者前台和后端之间的跳转 下面总结一下自己对于这些跳转路径的写法 声明:以下讲到的jsp文件都默认在WebRoot目录下 1.表单(Jsp)->Servle ...

  3. mybatis框架的第二天

    一.mybatis的基础crud的操作 先在接口中,写对应的方法名称,返回类型,访问符. 之后在映射配置文件中,写具体的实现 二.mybati中crud的细节 1.模糊查询 这是接口中 这是xml中 ...

  4. ESP32-简单OTA升级

    基于ESP-IDF4.1 1 #include "freertos/FreeRTOS.h" 2 #include "freertos/task.h" 3 #in ...

  5. P4827「国家集训队」 Crash 的文明世界

    「国家集训队」 Crash 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...

  6. 团队开发day08

    web端数据处理出现问题,不能通过servlet中的request获取属性值, 查找一番,前端的form设置上传数据格式为二进制类型,需要先转化,接收为 fileitem,在进行处理

  7. React组件三大属性之 refs

    React组件三大属性之 refs refs属性 1) 组件内的标签都可以定义ref属性来标识自己 a. <input type="text" ref={input => ...

  8. Hive——基本DDL语句

    Hive--基本DDL语句 DDL:Data Definition Language(数据定义语言,与关系型数据库相似) 官方手册:https://cwiki.apache.org/confluenc ...

  9. 使用deepin连接罗技k380

    1,刚开始总是连不上,连上了就断开了,以为是deepin系统的问题. 2,首先在华为论坛上找到这样的一片解决方案:https://cn.ui.vmall.com/thread-21831568-1-1 ...

  10. .net core番外第2篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入

    本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果. 前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html 正文: Autof ...