1. 程式人生 > >C/C++ 標頭檔案以及庫的搜尋路徑

C/C++ 標頭檔案以及庫的搜尋路徑

關鍵點: 1. #include <...>  不會搜尋當前目錄

                2. 使用 -I 引數指定的標頭檔案路徑僅次於 搜尋當前路徑。

               3.  gcc -E -v  可以輸出標頭檔案路徑搜尋過程

C++編譯時,教科書中寫道:#include “headfile.h”優先在當前目錄查詢標頭檔案;#include < headfile.h >從系統預設路徑查詢標頭檔案。先前以為系統預設路徑是環境變數$PATH指定的路徑,在系統上一查,傻了眼:

-bash-3.2$ echo $PATH

/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp/bin

全是bin目錄,$PATH是執行可執行檔案時的搜尋路徑,與include標頭檔案的搜尋路徑無關,可能不少人犯了我這樣的錯誤。

標頭檔案:

1. #include “headfile.h”

搜尋順序為:

先搜尋當前目錄

然後搜尋-I指定的目錄

再搜尋gcc的環境變數CPLUS_INCLUDE_PATHC程式使用的是C_INCLUDE_PATH

最後搜尋gcc的內定目錄

/usr/include

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

各目錄存在相同檔案時,先找到哪個使用哪個。

2.

 #include <headfile.h>

先搜尋-I指定的目錄

然後搜尋gcc的環境變數CPLUS_INCLUDE_PATH

最後搜尋gcc的內定目錄

/usr/include

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

與上面的相同,各目錄存在相同檔案時,先找到哪個使用哪個。這裡要注意,#include<>方式不會搜尋當前目錄!

這裡要說下include的內定目錄,它不是由$PATH環境變數指定的,而是由g++的配置prefix指定的(知道它在安裝g++時可以指定,不知安裝後如何修改的,可能是修改配置檔案,需要時再研究下

)

-bash-3.2$ g++ -v

Using built-in specs.

Target: x86_64-redhat-linux

Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux

Thread model: posix

gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)

在安裝g++時,指定了prefix,那麼內定搜尋目錄就是:

Prefix/include

Prefix/local/include

Prefix/lib/gcc/--host/--version/include

編譯時可以通過-nostdinc++選項遮蔽對內定目錄搜尋標頭檔案。

庫檔案:

編譯的時候:

gcc會去找-L

再找gcc的環境變數LIBRARY_PATH

再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程式內的(不可配置的?)

執行時動態庫的搜尋路徑:

動態庫的搜尋路徑搜尋的先後順序是:

編譯目的碼時指定的動態庫搜尋路徑(這是通過gcc 的引數"-Wl,-rpath,"指定。當指定多個動態庫搜尋路徑時,路徑之間用冒號""分隔)

環境變數LD_LIBRARY_PATH指定的動態庫搜尋路徑(當通過該環境變數指定多個動態庫搜尋路徑時,路徑之間用冒號""分隔)

配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;

預設的動態庫搜尋路徑/lib

預設的動態庫搜尋路徑/usr/lib

應注意動態庫搜尋路徑並不包括當前資料夾,所以當即使可執行檔案和其所需的so檔案在同一資料夾,也會出現找不到so的問題,類同#include <header_file>不搜尋當前目錄

參考資源:http://my.oschina.net/alphajay/blog/4953?from=rss