Linux下的頭文件搜索路徑


     對於以壓縮包發布的軟件,在它的目錄下通常都有一個配置腳本configure,它的作用確定編譯參數(比如頭文件位置、連接庫位置等),然后生成Makefile以編譯程序。可以進入該軟件的目錄,執行"./configure --help"命令查看使用幫。

一個程序能正確編譯、鏈接、運行需要滿足3個條件:預處理時能找到頭文件,連接時能找到庫(靜態庫或動態庫),運行時能找到庫。下面介紹頭文件的搜索路徑

GCC 搜索頭文件有三種策略:

1.內定搜索目錄,這是編譯器自身預設的目錄。由於是內定的,一定會搜索,所以總是最后才搜索。

2.手動指定搜索目錄。可以在執行配置命令configure前,通過環境變量C_INCLUDE_PATH進行設定;也可以在執行配置命令configure時,通過-I選項進行指定。

3.手動指定不進行搜索的目錄。這是在執行配置命令時,使用-nostdin選項進行指定。

-nostdinc選項

使編譯器不在系統缺省的頭文件目錄里面找頭文件,一般和 -I 聯合使用,明確限定頭文件的位置。

-nostdin C++選項

規定不在 g++ 指定的標准路經中搜索,但仍在其他路徑中搜索。此選項 在創libg++庫使用

GCC指定頭文件的方式

在程序中,常用兩種方法來包含頭文件:

#include <headerfile.h> 
#include "headerfile.h"

當#include <headerfile.h> 時,編譯時按照"編譯命令指定目錄--->--->系統預設目錄--->編譯器預設"的順序搜索頭文件。

當#include "headerfile.h",編譯時按照"源文件當前目錄---->編譯命令指定目錄--->系統預設目錄--->編譯器預設"的順序搜索頭文件。

編譯命令指定目錄

"指定的"頭文件目錄是編譯程序時使用" -I "選項來指定目錄。舉個例子:

mkdir -p /work/AAA/include /*臨時目錄,測試用*/ 
mkdir -p /work/BBB/include /*臨時目錄,測試用*/

export C_INCLUDE_PATH=/work/AAA/include

echo 'main() {}' | arm-linux-gcc -I/work/BBB/include -E -v -

得到以下輸出內容,從中可以看到查找頭文件時的路徑及優先順序:

... 
 #include "....." search starts here: 
#include <.....> search starts here:

/work/BBB/include 
/work/AAA/include

...

系統預設目錄

系統預設的頭文件目錄是通過環境變量C_INCLUDE_PATH來設置的,這個變量的值要在執行配置命令configure之前設置。

編譯器預設目錄

編譯器預設目錄由編譯器自己決定的,由程序代碼決定的,這是不需要工人設置或指定的。

可以總結出頭文件的查找路徑及優先順序:

1.如果源文件中使用雙引號來包含頭文件,則首先在源文件當前目錄查找頭文件。 
2.如果編譯時使用"-I/some/dir",則在/some/dir中查找。
3.如果設置了環境變量C_INCLUDE_PATH,則在指定的目錄中查找。
4.最后在編譯器預設的路徑中查找,這是不需要指定的,編譯時一定會在該路徑中搜索所需的頭文件。

所以,編譯程序時如果出現了找不到頭文件的錯誤,可以通過設置C_INCLUDE_PATH或給編譯器設置"-I"選線來指定頭文件目錄,這可以在執行配置命令configure之前設置C_INCLUDE_PATH或CFLAGS,如果不設置CFLAGS,它的默認值為"-g -O2",比如:

export C_INCLUDE_PATH="/some/dir/1:/some/dir/2"
export CFLAGS = "-g -O2 -I/some/dir" #如果設置了C_INCLUDE_PATH,就可以不設置CFLAGS

./configure

還有更好的方法,當明確知道要使用哪個動態庫時,可以通過pkg-config命令獲知要使用這個庫時編譯時的參數、連接時的參數。

先執行一下命令體驗一下:

export PKG_CONFIG_PATH=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/pkgconfig

pkg-config --cflags uuid -I/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include

.頭文件搜索路徑

gcc 在編譯時如何去尋找所需要的頭文件 :


-I選項指定的目錄--->gcc的環境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH--->再找編譯器內定目錄

如果裝gcc的時候,是有給定的prefix的話,那么就是

/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM