添加include文件路径_-isystem以及include_next的副作用
首先我們先來看下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的副作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在html中写js提示错误,页面HTML
- 下一篇: mysql解压包安装linuex_Cen