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++在編譯的時候是如何來查找和修改頭文件的?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章