头文件的查找方式和库的搜索路径
對于以壓縮包發布的軟件,在它的目錄下通常都有一個配置腳本configure,它的作用確定編譯參數(比如頭文件位置、連接庫位置等),然后生成Makefile以編譯程序。可以進入該軟件的目錄,執行"./configure --help"命令查看使用幫。
一個程序能正確編譯、鏈接、運行需要滿足3個條件:預處理時能找到頭文件,連接時能找到庫,運行時能找到庫。下面分別介紹:
1.指定頭文件位置
在程序中常用兩種方法來包含頭文件:
#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
...
可以總結出頭文件的查找路徑及優先順序。
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 history 历史命令行查
