文章目錄
- 一、雙引号和尖括号引用頭檔案的差別
- 二、-I 參數指定的路徑
- 三、環境變量 C_INCLUDE_PATH 或 CPLUS_INCLUDE_PATH 包含的路徑
- 四、内定路徑
本文涉及 gcc 的指令中,把 gcc 換成 g++ 同樣可以運作。
一、雙引号和尖括号引用頭檔案的差別
對于雙引号和尖括号包含的頭檔案的搜尋方式有細微差别,前者的搜尋路徑選擇先後為:使用
#include
的檔案所在的目前路徑,
-I
指定的路徑,環境變量
C_INCLUDE_PATH
或
CPLUS_INCLUDE_PATH
包含的路徑,内定路徑;而後者就隻有三種,依次是
-I
指定的路徑,環境變量
C_INCLUDE_PATH
或
CPLUS_INCLUDE_PATH
包含的路徑,内定路徑。下文着重介紹後者的那三種選擇:
-
參數指定的路徑;-I
- 環境變量
或C_INCLUDE_PATH
包含的路徑;CPLUS_INCLUDE_PATH
- 内定路徑。
前兩種可由我們自己指定哪些路徑,第三種是 gcc 内置的,使用者改變不了。
二、-I 參數指定的路徑
-I
參數的用法為
gcc <filename> -I <pathname_1> -I <pathname_2>
,-I 後邊隻能緊跟一個路徑名,想要手動指定幾個頭檔案搜尋路徑,就得寫幾個
-I
。
gcc hello.c -I ~/mydir1 -I ~/mydir2
三、環境變量 C_INCLUDE_PATH 或 CPLUS_INCLUDE_PATH 包含的路徑
gcc 在搜尋完
-I
參數指定路徑後,便會檢視環境變量
C_INCLUDE_PATH
或
CPLUS_INCLUDE_PATH
包含的路徑,這兩個環境變量都是路徑的集合,我們可以手動往這兩個環境變量裡添加路徑。
以
C_INCLUDE_PATH
為例,添加路徑有兩種方法,如果該新增路徑隻是臨時需要,則可以在指令行輸入
echo C_INCLUDE_PATH=$C_INCLUDE_PATH:<pathname>
;如果是長期需要,則應在
~/.bashrc
或
/etc/profile
添加
export C_INCLUDE_PATH=$C_INCLUDE_PATH:<pathname>
,然後儲存并退出檔案,在指令行中執行指令
source ~/.bashrc
或
source /etc/profile
。
四、内定路徑
第三種的内定路徑無法更改,但可以檢視,如何檢視呢?可先随便寫一個 C 檔案,然後在指令行執行指令
gcc <filename> -v
以顯示整個編譯過程。顯示内容有一行是
#include <...> search starts here:
,下邊顯示的路徑便是 gcc 内定的頭檔案搜尋路徑。筆者經過對 g++ 和 gcc 的指令測試,對内定的頭檔案搜尋目錄歸納如下。
# 編譯 C 檔案或 C++ 檔案時都會搜尋以下五個路徑
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/7/include
/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
/usr/include
/usr/include/x86_64-linux-gnu
# 編譯 C++ 檔案時才會搜尋以下三個路徑
/usr/include/x86_64-linux-gnu/c++/7
/usr/include/c++/7
/usr/include/c++/7/backward