首先我们先来看下include_next的用法

比如我们想include , 在cmath头文件中你可以看到有类似include_next 的语法,他跟传统的include不同,他不会从你的search path list的头部开始查找,他会跳出当前路径从下一个entry进行查找,比如我们来看例子

cmath在/usr/include/c++/6.1.1中, 但是math.h同时出现在下面两个文件夹中:

此时我们不想让他的math.h是在c++/6.1.1中截获,而是在/usr/include/math.h中找到,同时我们根据第一张图的列表确确实实发现此时6.1.1的路径在第一个,这个时候include_next就起作用了,他会跳出当前cmath的路径进行查找,自然而然就找到/usr/include/math.h了

但是当我们使用了-isystem的时候,情况就不一样了

g++ -isystem /usr/include

可以看到此时的/usr/include被你放到了顶端,此时你的include_next自然而然跳过了他的c++/6.1.1,同时又因为此时的/usr/include被你放在了最上面,所以他的最终结果就是找不到任何内容了

你可以运行一个简单例子来复现这个错误:

你会发现这样都会编译不过,原因就在于-isystem / include_next的结合,我们一个个来说。

首先来说下-isystem,他的作用是抑制编译器对后面所包含的include的路径的wanring,让编译器认为这是系统级别的头文件,请不要对他们产生任何的wraning,但是除此之外,这个-isystem却带来了一些副作用 - 他会修改你的header search list. 他会把你在后面指定的directory放在你整个system header directories的头部。 如果目录已经出现在你的search list中,那么他会从当前的位置进行删除。

同时,GCC 6.1.1之后C++ headers为了更好的支持standard C头文件,使用了#include_next的方式,比如在cmath里你可以找到类似#include_next .问题就出在了这个#include_next, 他不像传统#include一样会从整个search path的头部开始查找,他仅仅会从当前文件的下一个search path文件路径进行查找。同时,因为你的-isystem把/usr/include移到了整个cmath的之前,所以math.h就找不到了

相关math.h的查找过程可以通过 #include_next的用法 来查看

PS:

  • 如果错误出现在CMake中,可以通过尝试设置-DCMAKE_NO_SYSTEM_FROM_IMPORTED=1来解决
  • CMake之所以会出现错误的原因是因为他的find_package会添加对应的path到system include paths,所以尽量避免当目录已经在system search path中再利用-isystem来进行添加

添加include文件路径_-isystem以及include_next的副作用相关推荐

  1. 如何向linux中添加头文件,linux添加头文件路径

    gcc demo.c -o demo  -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...

  2. codeblock添加头文件路径和静态库路径(转自CSDN用户jiao319)

    通常在一些项目中需要使用外部的头文件和静态库文件,codeblock通过如下方法添加头文件和库文件. 以codeblock 10.05为例 添加头文件:依次点击project->bulid op ...

  3. vs2008 添加头文件路径

    在vc6中tools->options->directory可以设置 vs2008怎么设置添加编译的头文件路径的?以下两种途径任选一种 1)在解决方案上点右键打开解决方案属性页,通用属性, ...

  4. windows复制文件路径_如何在Windows 10上复制文件的完整路径

    windows复制文件路径 Sometimes, it's handy to copy the full path of a file or folder in Windows 10 to the c ...

  5. python更改文件路径_更换路径python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pypi 项目 github 地址 . (本版本 sdk 基于 json api ...

  6. Linux系统中添加库文件路径的方法

    库文件在链接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...

  7. 7 开机启动文件路径_为什么当我登录的时候,总有一些文件会被打开

    问题 我最近总是会收到如标题所述的问题,于是我决定是时候从我的私人工具包中拿出些东西了.(这其 中还包括为一些程序员准备的小知识) 第一个问题:当你登录后,一个类似于C:Program FilesLi ...

  8. java io 文件路径_如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径...

    如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径 我有一个包含2个包的项目: ListStopWords.txt ListStopWords.txt 在包(2)中我有 ...

  9. 中有冒号 文件路径_用Matlab脚本文件实现Excel文件的合并

    日常吐槽 前段时间跟同事聊天,同事洗脑了一个新的(扎心的)世界观,"人生分三个阶段,20岁时承认父母很平庸,30岁时承认自己很平庸,40岁时承认孩子很平庸".这是这位同事在孩子学而 ...

最新文章

  1. hdu 2222:Keywords Search
  2. Less (一种动态样式语言)
  3. opencv python教程简书_Python-OpenCV —— 基本操作一网打尽
  4. 基于java SSM校园兼职平台系统设计和实现
  5. thuinkphp5 input('post.arr1')接收数组出现:variable type error:array
  6. 线性代数 【22】 抽象的向量空间
  7. Nginx(一)-- 初体验
  8. 各国网络安全审查制度及案例分析
  9. 《MYSQL必知必会》—18.如何使用MySQL的Match()和Against()函数进行全文本搜索以及查询扩展的使用
  10. 图像处理——基于纹理分类的LBP算法及matlab+python算法实现
  11. ORACLE SQL日期函数
  12. 用安卓软件MT管理器破解元气骑士内购,小白照着也可以成功!
  13. 基于51单片机的无线病床呼叫系统装置 proteus仿真原理图程序设计
  14. 分享自己的页游运维架构
  15. 假设某台式计算机的内存容量为256,计算机二级试题与答案
  16. 2023年北京理工大学理论力学考研上岸前辈备考经验指导
  17. Excel全自动项目管理甘特图
  18. 哲学家与心理学家在选择性知觉上的不谋而合
  19. ...weights already exists, disallowed. Did you mean to set reuse=True...(解决办法)
  20. 【在Angular项目中使用googlemaps】

热门文章

  1. 下一代 IDE:Eclipse Che 究竟有什么奥秘?
  2. Cloud一分钟 | Facebook隐私泄露事件继续发酵,黑客明码标价出售聊天信息
  3. linux格式化usb设备,如何在 usb linux下格式化磁盘
  4. php如何获取文本中的换行符,如何获取字符里面的换行符
  5. opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析
  6. potplayer 多个进程_创建守护进程的步骤
  7. Nacos 集群集成SpringBoot2.x 微服务_02
  8. javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati
  9. SpringBoot 扫描包
  10. 如何把springboot项目部署到tomcat上