標頭檔案的查詢方式和庫的搜尋路徑

2021-10-07 08:12:51 字數 2240 閱讀 2450

對於以壓縮包發布的軟體,在它的目錄下通常都有乙個配置指令碼configure,它的作用確定編譯引數(比如標頭檔案位置、連線庫位置等),然後生成makefile以編譯程式。可以進入該軟體的目錄,執行"./configure --help"命令檢視使用幫。

1.指定標頭檔案位置

在程式中常用兩種方法來包含標頭檔案:

#include

#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

可以總結出頭檔案的查詢路徑及優先順序。

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

交叉編譯時庫的搜尋路徑

1.「-l」指定連線時庫的搜尋路徑,這些庫使用"-l"來顯示指定,比如"-labc"表示的庫檔案為libabc.so

2."-rpath-link"比"-l"多一項功能,它指定的目錄還可以用於搜尋依賴庫。

3."-rpath"比"-rpath-link"多一項功能,它指定的目錄會被編譯程序式中,當程式執行時,首先從這些目錄中尋找庫。

怎樣指定"-rpath-link"呢?聯結器arm-linux-ld通常是由arm-linux-gcc間接啟動的,而arm-linux-gcc並不認識"-rpath-link"選項,所以需要在前面加上關鍵字"-wl",表示選項用於聯結器。在執行配置命令configure之前設定ldflags即可,比如:

export ldflags="-wl,-rpath-link-wl,/work/crossbuild/x/lib -wl,-rpath-link-wl,/work/corssbuild/gtk/lib"

./configure

指定執行時庫的位置

執行庫時的查詢路徑及優先順序如下:

1.編譯時使用"-rpath"指定目錄。

2.環境變數ld_library_path指定的目錄(它可以指定多個目錄,以冒號分隔)。

3.預設路徑:/lib、/usr/lib.

Linux系統的標頭檔案和庫檔案搜尋路徑

linux系統的標頭檔案和庫檔案搜尋路徑 include的header檔案,鏈結資料庫,系統定義,總共有下列 指定gcc去那找。當初在編譯時指定的 在 gcc gcc collect2.c locatelib 寫在specs內的 後來用 d i l指定的 gcc環境變數設定 編譯的時候 ld.so的...

Linux標頭檔案庫檔案搜尋路徑

include的header檔案,鏈結資料庫,系統定義,總共有下列 指定gcc去那找。當初在編譯時指定的 在 gcc gcc collect2.c locatelib 寫在specs內的 後來用 d i l指定的 gcc環境變數設定 編譯的時候 ld.so的環境變數 這是run time的時候 一 ...

include 標頭檔案的搜尋路徑

include 標頭檔案的搜尋路徑 2007年01月29日 星期一 18 57 include 指令的兩種使用形式 1 尖括號告訴編譯器在乙個或者多個標準系統目錄中找到檔案 usr include usr local include 2 雙引號意味著首先搜尋本地目錄 如果在本地目錄找不到,再到標準系...