背景:
今天想把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++在编译的时候是如何来查找和修改头文件的?
今天的文章
linux无法打开exe文件_Java no such file or directory分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60594.html