linux下无法打开包括文件:“pcl/io/pcd_io.h”: No such file or directory

背景:

今天想把Apollo中TestData对应的点云pcds数据处理出来,然后在linux编译链接的时候出现了,无法打开包括文件pcl/io/pcd_io.h,没有这个文件和路径。后来我查了些资料,知道C++在预处理的include的时候,会默认的包含两个路径:

  • /usr/local/include(当前用户的include目录)
  • /usr/include(整个系统的inlcude目录)

但是疑惑在于,我同样是包含了vector,string这种头文件,并且我没有添加任何目录,为什么这些文件就可以找得到呢?

vector,string的路径是:/usr/include/c++/5,这使得我错误的理解包含路径的时候可以不是包含它的前一级目录,而是只要包含了上面某一级目录,就会递归查询

所以我去查询了想要包含文件“pcl/io/pcd_io.h”的路径在“/usr/local/include/pcl-1.8/pcl/io”文件夹下。这让我百思不得其解 ,不是递归查询吗?为什么我这个头文件明明就是在默认查找的/usr/local/include目录下啊?

折腾了N小时后。。我室友说干脆先在环境变量CPLUS_INCLUDE_PATH添加当前路径,来使得c++在预处理的时候能包含当前头文件吧,后来试了试是可以解决的。

但是我还是好奇一开始的问题:为什么C++编译器没有修改CPLUS_INCLUDE_PATH环境变量就可以直接包含呢?(当然这个时候我还是以为是递归查询的)。

 

原因:

这时我同门跟我说可以根据指令:`g++ -print-prog-name=cc1plus` -v 来查询默认的include路径。此时我就发现了,抛开我刚刚用环境变量CPLUS_INCLUDE_PATH添加的两个路径:

  • /usr/local/include/pcl-1.8
  • /usr/inlcude/eigen3

在这个默认include路径中居然有/usr/include/c++/5,可见,我们在使用:yum install gcc-c++安装c++的时候,它已经帮我们包含了这个默认inlcude路径啊!

这时候我想到,其实根据头文件路径+include<xxx>就是一个绝对路径的简写:

比如你使用绝对路径:

  • #include</usr/local/include/pcl-1.8/pcl/io/pcd_io.h>

和你使用默认inlcude加简写的inlcude:

  • 默认include:/usr/local/include/pcl-1.8,加简写的include路径:#include<pcl/io/pcds_io.h>

这两个组合起来不就是一个东西吗?

 

解决的办法:

如果是使用g++的话,可以先使用locate .bashrc,.bashrc是环境配置文件,找到文件.bashrc。我的目录是/home/zss,然后的使用vim打开,快捷键G到文件的底部加上对CPLUS_INCLUDE_PATH环境变量进行修改。

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/pcl1.8:/usr/include/eigen
#加eigen的原因是调用的时候发现还缺少eigen库

在.bashrc文件中修改、在shell中修改CPLUS_INCLUDE_PATH的区别在于:

~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取;直接在shell中修改的话,如果你重启了 ,那么该修改就被抹去了。

 

参考文献:

g++在编译的时候是如何来查找和修改头文件的?

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值