日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/27 编程问答 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 添加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的副作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。